函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法
1 2 3 4 |
def functionname( parameters ): "function_docstring" function_suite return [expression] |
实例:
1 2 3 4 |
def Hello(): print("Hello,py40!") Hello(); |
带参数函数,实例
1 2 3 4 |
def Hello(name): print("Hello,",name) Hello("py40") |
参数传递
Python参数传递采用的是“传对象引用”的方式。这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值。如果函数收到的是一个不可变对象(比如数字、字符串或者元组)的引用,就不能直接修改原始对象--相当于通过“传值’来传递对象。
例如:
1 2 3 4 5 6 7 8 9 10 11 |
# 可写函数说明 def changeme( mylist ): print("修改传入的列表") mylist.append([1,2,3,4]); print ("函数内取值: ", mylist) return # 调用changeme函数 mylist = [10,20,30]; changeme( mylist ); print ("函数外取值: ", mylist) |
传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:
1 2 3 4 |
C:\Users\Administrator>E:\python\learn\lean001.py 修改传入的列表 函数内取值: [10, 20, 30, [1, 2, 3, 4]] 函数外取值: [10, 20, 30, [1, 2, 3, 4]] |
修改String值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#修改字符串 def ChangeString(string): string = 'i changed as this' print string return string = 'hello world' ChangeString(string) print string #修改字符串 def ChangeString(string): string = 'i changed as this' print string return string = 'hello world' ChangeString(string) print string |
输出结果为:
1 2 3 |
i changed as this hello world i changed as this |
参数
以下是调用函数时可使用的正式参数类型:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
1 2 3 4 5 6 7 |
#"打印任何传入的字符串" def printme( str ): print (str); return; #调用printme函数 printme(); |
以上实例输出结果:
1 2 3 |
C:\Users\Administrator>E:\python\learn\lean001.py File "E:\python\learn\lean001.py", line 7 printme(); |
^
SyntaxError: invalid syntax
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
实例
1 2 3 4 5 6 7 |
#"打印任何传入的字符串" def printme( str ): print (str); return; #调用printme函数 printme( str = "菜鸟教程"); |
以下实例中演示了函数参数的使用不需要使用指定顺序:
1 2 3 4 5 6 7 8 |
# "打印任何传入的字符串" def printinfo( name, age ): print ("名字: ", name); print ("年龄: ", age); return; #调用printinfo函数 printinfo( age=50, name="py40.com" ); |
以上实例输出结果:
1 2 |
名字: py40.com 年龄: 50 |
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
# “打印任何传入的字符串”
1 2 3 4 |
def printinfo( name, age = 35 ): print ("名字: ", name); print ("年龄: ", age); return; |
#调用printinfo函数
printinfo( age=50, name=”py40.com” );
print (“————————“)
printinfo( name=”py40.com” );
以上实例输出结果:
1 2 3 4 5 |
名字: py40.com 年龄: 50 ------------------------ 名字: py40.com 年龄: 35 |
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
1 2 3 4 |
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression] |
加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:
#!/usr/bin/python3
1 2 3 4 5 6 7 8 9 10 11 12 |
# 可写函数说明 def printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) for var in vartuple: print (var) return; # 调用printinfo 函数 printinfo( 10 ); printinfo( 70, 60, 50 ); |
以上实例输出结果:
1 2 3 4 5 6 |
输出: 10 输出: 70 60 50 |
匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda 函数的语法只包含一个语句,如下:
1 |
lambda [arg1 [,arg2,.....argn]]:expression |
如下实例:
1 2 3 4 5 6 |
# 可写函数说明 sum = lambda arg1, arg2: arg1 + arg2; # 调用sum函数 print ("相加后的值为 : ", sum( 10, 20 )) print ("相加后的值为 : ", sum( 20, 20 )) |
以上实例输出结果:
1 2 |
相加后的值为 : 30 相加后的值为 : 40 |
return语句
return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。:
1 2 3 4 5 6 7 8 9 10 |
# 可写函数说明 def sum( arg1, arg2 ): # 返回2个参数的和." total = arg1 + arg2 print ("函数内 : ", total) return total; # 调用sum函数 total = sum( 10, 20 ); print ("函数外 : ", total) |
以上实例输出结果:
1 2 |
函数内 : 30 函数外 : 30 |
变量作用域
Pyhton 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
1 2 3 4 5 6 7 8 9 10 11 |
total = 0; # 这是一个全局变量 # 可写函数说明 def sum( arg1, arg2 ): #返回2个参数的和." total = arg1 + arg2; # total在这里是局部变量. print ("函数内是局部变量 : ", total) return total; #调用sum函数 sum( 10, 20 ); print ("函数外是全局变量 : ", total) |
以上实例输出结果:
1 2 |
函数内是局部变量 : 30 函数外是全局变量 : 0 |
未经允许不得转载:Python在线学习 » 【第十四节】Python函数