Python之函数与变量(5)

由以上两个示例可见,对于除去传递给位置参数和默认参数之外多余的参数,如果是直接以value的形式提供实参,则会被传递给可变长参数args而成为一个元组中的元素;如果是以key=value的形式提供实参,则会被传递给关键字参数kwargs而成为一个字典中的元素。

纳尼?你还想试试其他传参方式?看看下面有没有你想要的 >>> t=('Jerry', 19, 'F', 'Hebei') >>> my_print(*t) NAME: Jerry AGE: 19 ('F', 'Hebei') {} >>> d={'name':'Tom', 'age':18, 'sex':'F', 'addr':'Hebei'} >>> my_print(**d) NAME: Tom AGE: 18 () {'sex': 'F', 'addr': 'Hebei'} >>> d={'sex':'F', 'addr':'Hebei'} >>> my_print(age=18, name='Tom', **d) NAME: Tom AGE: 18 () {'sex': 'F', 'addr': 'Hebei'} >>> t=('Tom', 18, 'abc') >>> d={'sex':'F', 'addr':'Hebei'} >>> my_print(*t, **d) NAME: Tom AGE: 18 ('abc',) {'sex': 'F', 'addr': 'Hebei'} >>> my_print(name='Tom', 18, sex='F', addr='Hebei') File "<stdin>", line 1 SyntaxError: positional argument follows keyword argument 4. 总结

关于Python中的函数参数说了这么多,我觉得很多必要来个总结:

Python中函数的参数有4中:位置参数、默认参数(有默认值的位置参数)、可变(长)参数、关键字参数(特殊的、优化过的可变长参数);

无论是函数定义时声明形参,还是函数调用时传递实参,都必须按照上面的顺序进行(允许只包含一种或几种不同种类的参数);简单点来说就是,调用函数时key=value形式的关键参数必须在value形式的参数后面;

Python函数调用时,传递的实参会对应的传递给相应的形参,同一个形参接收到的实参不能多也不能少;

四、全局变量与局部变量

一个程序中的变量是有作用域的,作用域的大小会限制变量可访问的范围。根据作用域范围的大小不同可以分为:全局变量和局部变量。顾名思义,全局变量表示变量在全局范围内都可以被访问,而局部变量只能在一个很小的范围内生效。这就好比国家主席与各省的省长:在全国范围内国家主席都是同一个人,因此国家主席就是个全局变量;而各省的省长只能在某个省内生效,河北省省长是一个人,河南省省长又是另外一个人,因此省长就是个局部变量。对于Python编程语言而言,定义在一个函数内部的变量就是一个局部变量,局部变量只能在其被声明的函数内访问;定义在函数外部的变量就是全局变量,全局变量可以在整个程序范围内访问。

来看个示例:

#!/usr/bin/env python # -*- encoding:utf-8 -*- name = 'Tom' def func1(): age = 10 print(name) print(age) def func2(): sex = 'F' print(name) print(sex) print(name) func1() func2()

输出结果:

Tom Tom 10 Tom F

上面的示例中,name是一个全局变量,因此它在程序的任何地方都可以被访问;而func1函数中的age变量和func2函数中的sex变量都是局部变量,因此它们只能在各自定义的函数中被访问。

问题1:如果在函数内定义一个与全局变量同名的变量会怎样? #!/usr/bin/env python # -*- encoding:utf-8 -*- name = 'Tom' def func3(): name = 'Jerry' print(name) print(name) func3() print(name)

输出结果:

Tom Jerry Tom

通过上面两个示例的输出结果我们可以得出这样的结论:

函数内引用一个变量时,会先查找该函数内部是否存在这样一个局部变量,如果存在则直接引用该局部变量,否则将查找并引用全局变量;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/82f73b1a8d40a964c0644454c0bfacb8.html