- ·上一篇文章:Python3 迭代器与生成器
- ·下一篇文章:Python3 数据结构
Python3 函数
35不定长参数你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串" function_suite return [expression]加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ):
"打印任何传入的参数"print ("输出:
")print (arg1)print (vartuple)
# 调用printinfo 函数printinfo( 70, 60, 50 )以上实例输出结果:输出:
70(60, 50)如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ):
"打印任何传入的参数"print ("输出:
")print (arg1)for var in vartuple:
print (var)return
# 调用printinfo 函数printinfo( 10 )printinfo( 70, 60, 50 )以上实例输出结果:输出:
10输出:
706050还有一种就是参数带两个星号 **基本语法如下:def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串" function_suite return [expression]加了两个星号 ** 的参数会以字典的形式导入。实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, **vardict ):
"打印任何传入的参数"print ("输出:
")print (arg1)print (vardict)
# 调用printinfo 函数printinfo(1, a=2,b=3)以上实例输出结果:输出:
1{'a':
2, 'b':
3}声明函数时,参数中星号 * 可以单独出现,例如:
def f(a,b,*,c):
return a+b+c如果单独出现星号 * 后的参数必须用关键字传入。>>> def f(a,b,*,c):
... return a+b+c... >>> f(1,2,3)
# 报错Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError:
f() takes 2 positional arguments but 3 were given>>> f(1,2,c=3)
# 正常6>>>匿名函数python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。lambda 只是一个表达式,函数体比 def 简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。语法lambda 函数的语法只包含一个语句,如下:lambda [arg1 [,arg2,.....argn]]:
expression如下实例:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明sum = lambda arg1, arg2:
arg1 + arg2
# 调用sum函数print ("相加后的值为 :
", sum( 10, 20 ))print ("相加后的值为 :
", sum( 20, 20 ))以上实例输出结果:相加后的值为 :
30相加后的值为 :
40return语句return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def sum( arg1, arg2 ):
# 返回2个参数的和."total = arg1 + arg2print ("函数内 :
", total)return total
# 调用sum函数total = sum( 10, 20 )print ("函数外 :
", total)以上实例输出结果:函数内 :
30函数外 :
30变量作用域Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:L (Local) 局部作用域E (Enclosing) 闭包函数外的函数中G (Global) 全局作用域B (Built-in) 内建作用域以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。x = int(2.9)
# 内建作用域 g_count = 0
# 全局作用域def outer():
o_count = 1
# 闭包函数外的函数中 def inner():
i_count = 2
# 局部作用域Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:>>> if True:
... msg = 'I am from Runoob'... >>> msg'I am from Runoob'>>> 实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:>>> def test():
... msg_inner = 'I am from Runoob'... >>> msg_innerTraceback (most recent call last):
File "<stdin>", line 1, in <module>NameError:
name 'msg_inner' is not defined>>> 从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。全局变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:实例(Python 3.0+)
#!/usr/bin/python3total = 0
# 这是一个全局变量
# 可写函数说明def sum( arg1, arg2 ):
#返回2个参数的和."total = arg1 + arg2
# total在这里是局部变量.print ("函数内是局部变量 :
", total)return total
#调用sum函数sum( 10, 20 )print ("函数外是全局变量 :
", total)以上实例输出结果:函数内是局部变量 :
30函数外是全局变量 :
0global 和 nonlocal关键字 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。以下实例修改全局变量 num:实例(Python 3.0+)
#!/usr/bin/python3num = 1def fun1():
global num
# 需要使用 global 关键字声明print(num)num = 123print(num)fun1()print(num)以上实例输出结果:1123123如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:实例(Python 3.0+)
#!/usr/
"函数_文档字符串" function_suite return [expression]加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ):
"打印任何传入的参数"print ("输出:
")print (arg1)print (vartuple)
# 调用printinfo 函数printinfo( 70, 60, 50 )以上实例输出结果:输出:
70(60, 50)如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, *vartuple ):
"打印任何传入的参数"print ("输出:
")print (arg1)for var in vartuple:
print (var)return
# 调用printinfo 函数printinfo( 10 )printinfo( 70, 60, 50 )以上实例输出结果:输出:
10输出:
706050还有一种就是参数带两个星号 **基本语法如下:def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串" function_suite return [expression]加了两个星号 ** 的参数会以字典的形式导入。实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def printinfo( arg1, **vardict ):
"打印任何传入的参数"print ("输出:
")print (arg1)print (vardict)
# 调用printinfo 函数printinfo(1, a=2,b=3)以上实例输出结果:输出:
1{'a':
2, 'b':
3}声明函数时,参数中星号 * 可以单独出现,例如:
def f(a,b,*,c):
return a+b+c如果单独出现星号 * 后的参数必须用关键字传入。>>> def f(a,b,*,c):
... return a+b+c... >>> f(1,2,3)
# 报错Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError:
f() takes 2 positional arguments but 3 were given>>> f(1,2,c=3)
# 正常6>>>匿名函数python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。lambda 只是一个表达式,函数体比 def 简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。语法lambda 函数的语法只包含一个语句,如下:lambda [arg1 [,arg2,.....argn]]:
expression如下实例:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明sum = lambda arg1, arg2:
arg1 + arg2
# 调用sum函数print ("相加后的值为 :
", sum( 10, 20 ))print ("相加后的值为 :
", sum( 20, 20 ))以上实例输出结果:相加后的值为 :
30相加后的值为 :
40return语句return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:实例(Python 3.0+)
#!/usr/bin/python3
# 可写函数说明def sum( arg1, arg2 ):
# 返回2个参数的和."total = arg1 + arg2print ("函数内 :
", total)return total
# 调用sum函数total = sum( 10, 20 )print ("函数外 :
", total)以上实例输出结果:函数内 :
30函数外 :
30变量作用域Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:L (Local) 局部作用域E (Enclosing) 闭包函数外的函数中G (Global) 全局作用域B (Built-in) 内建作用域以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。x = int(2.9)
# 内建作用域 g_count = 0
# 全局作用域def outer():
o_count = 1
# 闭包函数外的函数中 def inner():
i_count = 2
# 局部作用域Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:>>> if True:
... msg = 'I am from Runoob'... >>> msg'I am from Runoob'>>> 实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:>>> def test():
... msg_inner = 'I am from Runoob'... >>> msg_innerTraceback (most recent call last):
File "<stdin>", line 1, in <module>NameError:
name 'msg_inner' is not defined>>> 从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。全局变量和局部变量定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:实例(Python 3.0+)
#!/usr/bin/python3total = 0
# 这是一个全局变量
# 可写函数说明def sum( arg1, arg2 ):
#返回2个参数的和."total = arg1 + arg2
# total在这里是局部变量.print ("函数内是局部变量 :
", total)return total
#调用sum函数sum( 10, 20 )print ("函数外是全局变量 :
", total)以上实例输出结果:函数内是局部变量 :
30函数外是全局变量 :
0global 和 nonlocal关键字 当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。以下实例修改全局变量 num:实例(Python 3.0+)
#!/usr/bin/python3num = 1def fun1():
global num
# 需要使用 global 关键字声明print(num)num = 123print(num)fun1()print(num)以上实例输出结果:1123123如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:实例(Python 3.0+)
#!/usr/
Python3 函数