1.返回值
python函数可以有多个返回值:
```python代码如下:
# 返回多个值
def student_name_and_age():
name=input("请输入姓名\n")
age=int(input("请输入年龄\n"))
return name,age
res=student_name_and_age()
print(type(res))
print(res)
结果如下:
请输入姓名
zhangsan
请输入年龄
18
<class 'tuple'> //若函数返回多个值会打包为元组
('zhangsan', 18)
2.参数传递
1.位置参数
位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入参数、数量和生命时一样。
def show(name,age):
print(name,age)
show("张三","18")
2.缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
def show(name,age="18"):
print('姓名:%s 年龄 %s' %(name,age))
show("张三")
结果:
姓名:张三 年龄 18
#也可以为默认参数赋值
show("张三",20)
结果:
姓名:张三 年龄 20
3.可变参数
传入的参数个数是可变的 可变参数允许你传入0个或任意个参数,这些参数在函数调用时自动组装为一个tuple
def all_names(*args):
print(type(args))
for name in args:
print('姓名:',name)
all_names('张三','李四','王五')
结果:
<class 'tuple'>
姓名: 张三
姓名: 李四
姓名: 王五
4.关键字参数
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
def info(name,age,**kw):
print(type(kw))
print("名字:",name)
print("年龄:",age)
print(kw)
info("张三",18,heignt=180,hobby='ball')
结果:
<class 'dict'>
名字: 张三
年龄: 18
{'heignt': 180, 'hobby': 'ball'}
关于python中的解引用(序列解包)的简单说明
将元组(*)解包成位置参数,将字典(**)解包成关键字参数
例(*):
def show(a,b,c):
print(a,b,c)
t=(1,2,3)
show(*t)
结果:
1 2 3
例(**):
def show(a,b,c):
print(a,b,c)
show(b=3,a=2,c=3)
d={'a':1,'b':2,'c':3}
show(**d)
结果:
2 3 3
1 2 3
注意:
注意:若解包字典时只用了一个 * ,则相当于使用了字典中的键而不是值 当然也不限于元组和字典,也可以用于字符串,数组等序列 例:
import random
score = [random.randrange(1,101) for i in range(10)]
score.sort()
print('评委打分:',score)
a,*b,c=score
print('去掉最高最低分后:',b)
# 评委打分: [11, 46, 54, 60, 65, 68, 73, 77, 92, 100]
# 去掉最高最低分后: [46, 54, 60, 65, 68, 73, 77, 92]
5.命名关键字参数
如果要限制关键字参数的名字,就可以用命名关键字参数
标准写法如下:
def info(name,age,*,height,weight):
print('我的名字叫: ',name,'年龄: ',age,'身高',height,'体重',weight)
info("张三",18,height=180,weight=75)
结果:
我的名字叫: 张三 年龄: 18 身高 180 体重 75
6.参数的组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
例1
def student_info(name, age=18, *books, **kw):
print('我的名字叫:', name, '年龄:', age,'其它信息:',kw)
if 'city' in kw:
print('来自:', kw['city'])
for book in books:
print('我有',book,'书')
student_info('张三', 18, '语文','数学','计算机', city='北京', height=180, weight=75)
例2
def student_info(name, age=18, *books, city, **kw):
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
print('我的名字叫:', name, '年龄:', age,'其它信息:',kw)
print('来自:', city)
for book in books:
print('我有',book,'书')
student_info('张三', 18, '语文','数学','计算机', city='北京', height=180, weight=75)
3.变量的作用域和global变量
1.局部变量 作用域:在函数内
2.全局变量 作用域:在函数外
函数优先使用局部变量 在没有局部变量的情况下, 使用全局变量
易错代码如下:
name="张三"
def change_my_name():
print('我的名字曾经是', name)
name = '李四'
print('我的名字现在是', name)
change_my_name()
结果:
UnboundLocalError: local variable 'name' referenced before assignment
上述代码解析: 在change_my_name函数中第二行重新定义name,则此函数认为在函数中name是局部变量,所以出现在name变量在定义前被引用的错误(即使有全局变量name)
解决方案:global关键字
name="张三"
def change_name():
global name
print("改变前的姓名:",name)
name="李四"
print("改变后的姓名:",name)
change_name()
name
输出:
改变前的姓名: 张三
改变后的姓名: 李四
'李四'
结束
|