Python3.5入门学习记录-函数

Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。python

函数能提升应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,好比print()。但你也能够本身建立函数,这被叫作用户自定义函数。express

定义一个函数

你能够定义一个由本身想要功能的函数,如下是简单的规则:函数

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间能够用于定义参数。
  • 函数的第一行语句能够选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,而且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return至关于返回 None。

实例测试

def sayHello(name):
   return "Hello:{0}".format(name)

这是一个很是简单的Python函数,接受一个参数,而后返回。ui

函数的调用spa

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。3d

这个函数的基本结构完成之后,你能够经过另外一个函数调用执行,也能够直接从Python提示符执行。code

以下实例调用了sayHello()函数:orm

#定义函数
def sayHello(name):
   return "Hello:{0}".format(name)

#调用函数
print(sayHello("jiming"))

输出结果为:对象

image

全部参数在Python里都是按引用传递,若是你在函数内部修改了参数,那么原始的参数也被改变了

例如:

myList = [1,2,3]

print("修改前myList值:",myList)

def changeMyList(list):
   myList[0:] = [3,2,1]
   print("函数内修改后myList值:",myList)

changeMyList(myList)

print("函数外修改后myList值:",myList)

在上述代码中,咱们在函数内将myList的值改成3,2,1,代码执行结果为:

image

 

注意:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是能够修改的对象

咱们来作个测试:

Money = 2000

print("修改以前函数外Money值:{0}".format(Money))

def AddMoney(_money):
   _money +=1
   print("修改以后函数内Money值:{0}".format(Money))

AddMoney(Money)
print("修改以后函数外Money值:{0}".format(Money))

结果为:image

看到了吧,Money的值确实没有改变,由于当你想修改不可更改的对象时,其实就开辟了一个新的存储空间新的对象。

函数的参数

如下是调用函数时可以使用的正式参数类型:

  • 必备参数
  • 关键字参数
  • 默认参数
  • 不定长参数

一、必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的同样。

调用sayHello()函数,你必须传入一个参数,否则会出现语法错误.

二、关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来肯定传入的参数值。

使用关键字参数容许函数调用时参数的顺序与声明时不一致,由于 Python 解释器可以用参数名匹配参数值。咱们把sayHello改为须要传入两个参数的函数:

#定义函数
def sayHello(name1,name2):
   return "Hello:{0} and {1}".format(name1,name2)

print (sayHello(name2="jiming2",name1="jiming1"))

以上代码name1和name2的传入顺序和函数的定义不一致,可是咱们使用关键字name1\name2进行了限定,所以函数仍是可以正确读取对应的参数的

三、缺省参数

调用函数时,缺省参数的值若是没有传入,则被认为是默认值。这个和C#的缺省参数是同样的,例如:

#定义函数
def sayHello(name1,name2="jiming2"):
   return "Hello:{0} and {1}".format(name1,name2)

print (sayHello("jiming1"))

输出的结果为:

image

若是咱们把name1改成缺省参数,而name2为必备参数的时候,代码还能正确运行吗?

#定义函数
def sayHello(name1="jiming1",name2):
   return "Hello:{0} and {1}".format(name1,name2)

print (sayHello("jiming2"))

编译器汇报以下错误:SyntaxError: non-default argument follows default argument

也就是说,咱们把必备参数放到缺省参数的后面,会产生歧义

四、不定长参数

你可能须要一个函数能处理比当初声明时更多的参数。这些参数叫作不定长参数,和上述2种参数不一样,声明时不会命名。基本语法以下:

def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

实例

#定义函数
def sayHello(sayPerson,*allPersons):
   for p in allPersons:
      print("{0} say :'Hello:{1}'".format(sayPerson, p))

sayHello("jiming","friend1","friend2","friend3")

输出结果为:

image

为了不歧义,不定长参数也应该放到方法参数的最后一个

匿名函数

python 使用 lambda 来建立匿名函数。

  • lambda只是一个表达式,函数体比def简单不少。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有本身的命名空间,且不能访问自有参数列表以外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增长运行效率。

实例:

sum = lambda arg1, arg2: arg1 + arg2;
 
# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )

变量做用域

一个程序的全部的变量并非在哪一个位置均可以访问的。访问权限决定于这个变量是在哪里赋值的。

变量的做用域决定了在哪一部分程序你能够访问哪一个特定的变量名称。两种最基本的变量做用域以下:

  • 全局变量
  • 局部变量

全局变量和局部变量

定义在函数内部的变量拥有一个局部做用域,定义在函数外的拥有全局做用域。

局部变量只能在其被声明的函数内部访问,而全局变量能够在整个程序范围内访问。调用函数时,全部在函数内声明的变量名称都将被加入到做用域中

相关文章
相关标签/搜索