Python学习笔记7(函数)
1.定义函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
1 def printme( str ): 2 "打印传入的字符串到标准显示设备上" 3 print(str) 4 return
2.参数
以下是调用函数时可使用的正式参数类型:
- 位置参数
- 关键字参数
- 默认参数
- 不定长参数
a.位置参数
位置参数须以定义函数时参数顺序传入。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
#可写函数说明 >>>def printme( str ): >>> "打印任何传入的字符串" >>> print(str) #调用printme函数 >>>printme(); Traceback (most recent call last): File "test.py", line 11, in <module> printme(); TypeError: printme() takes exactly 1 argument (0 given)
b.关键字参数
函数调用时如果不想按照顺序填写参数函数,那么就使用关键字参数来确定传入的参数值。
但记住一个要求就是,关键参数必须放在位置参数之后。
1 #可写函数说明 2 >>>def printinfo( name, age ): 3 >>> "打印任何传入的字符串" 4 >>> print ("Name: ", name) 5 >>> print ("Age:", age) 6 7 #调用printinfo函数 8 >>>printinfo( age=50, name="miki" ); 9 10 Name:miki 11 Age:50
c.默认参数
默认参数的值如果没有传入,则取用默认值。
下例会打印默认的age,如果age没有被传入:
1 #可写函数说明 2 >>>def printinfo( name, age = 35 ): 3 >>> "打印任何传入的字符串" 4 >>> print("Name: ", name) 5 >>> print("Age: ", age) 6 7 #调用printinfo函数 8 >>>printinfo( age=50, name="miki" ) 9 >>>printinfo( name="miki" ) 10 11 12 Name: miki 13 Age:50 14 Name: miki 15 Age:35
d.不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
和上述2种参数不同,声明时不会命名。基本语法如下:
1 def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式 2 print(name,age,args) 3 4 stu_register("spring",22) 5 #输出 6 #spring 22 () #后面这个()就是args,只是因为没传值,所以为空 7 8 stu_register("zy",23,"CN","Python") 9 #输出 10 #zy 23 ('CN', 'Python')
还可以有一个**kwargs
1 def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式 2 print(name,age,args,kwargs) 3 4 stu_register("spring",22) 5 #输出 6 #spring 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 7 8 stu_register("zy",23,"CN","Python",sex="Male",province="Henan") 9 #输出 10 #zy 23 ('CN', 'Python') {'province': 'Henan', 'sex': 'Male'}
3.return语句
要想获取函数的执行结果,就可以用return语句把结果返回。
注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None.
4.匿名函数
python 使用 lambda 来创建匿名函数。
1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10))
你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下
1 res = map(lambda x:x**2,[1,5,7,4,8]) 2 for i in res: 3 print(i) 4 5 6 输出 7 1 8 25 9 49 10 16 11 64
5.递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
1 def calc(n): 2 print(n) 3 if int(n/2) ==0: 4 return n 5 return calc(int(n/2)) 6 7 calc(10) 8 9 输出: 10 10 11 5 12 2 13 1
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
6.变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域为:
全局变量和局部变量。
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
1 name = "zhang" 2 3 def change_name(name): 4 print("before change:",name) 5 name = "yan" 6 print("after change", name) 7 8 9 change_name(name) 10 11 print("在外面看看name改了么?",name) 12 13 14 before change: zhang 15 after change yan 16 在外面看看name改了么? zhang