函数(二)
不定长参数
- 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
- 带*号的形参只能有一个,可以和其他参数配合使用
- *形参只能接受位置参数,不能接受关键字参数
def fun(a ,c= 2,*b):
print(a,b,c)
fun(2) # 得 2 () 2
fun(2,3) # 得 2 () 3
fun(2,3,4) # 得 2 (4,) 3
fun(2,3,4,5) # 得 2 (4, 5) 3
fun(2,3,b =4) # 报错,*形参只能接受位置参数,不能接受关键字参数
- **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
- **形参只能有一个,并且必须写在所有参数的后面
def fun(*b,a =2,**c): # 带*号形参放在开头,其他参数必须以关键字参数表现
print(a,b,c) # 要么形参指定默认值,要么实参放在位置参数后面,不然会报错
fun(2,3,4) # 得 2 (2, 3, 4) {}
fun(2,3,4,5) # 得 2 (2, 3, 4, 5) {}
fun(2,3,4,5,a =3) # 得 3 (2, 3, 4, 5) {}
fun(2,3,4,c=3,d=7) # 得 2 (2, 3, 4) {'c': 3, 'd': 7}
fun(2,3,4,c=3, a=3,d=7) # 得 3 (2, 3, 4) {'c': 3, 'd': 7}
参数的解包
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数一致
def fun(b,a ,c):
print(a,b,c)
fun(*'123') # 得 2 1 3 (字符串解包)
fun(*[1,2,3]) # 得 2 1 3 (列表解包)
fun(*[1],2,*[3]) # 得 2 1 3 (多*解包,Python3.5以上版本支持)
fun(*(1,2,3)) # 得 2 1 3 (元组解包)
fun(*{'a' : 1,'b' : 2,'c' : 3}) # 得 b a c (字典key解包)
fun(**{'a' : 1,'b' : 2,'c' : 3}) # 得 1 2 3 (字典value解包)
函数的返回值
- 返回值就是函数执行以后返回的结果
- 通过return来指定函数的返回值
- return后面可以跟任意对象,返回值甚至可以是一个函数
def ftoc(f):
c = (f - 32) / 1.8
# print('%.1f'%c)
return c # return后面可以跟任意对象,返回值甚至可以是一个函数
# ftoc(98)
t = '%.1f'%ftoc(float(input('请输入你的体温:'))) + '℃'
print(t) # 输入 98 返回值 36.7℃
文档字符串
- help()是Python中内置函数,通过help()函数可以查询Python中函数的用法
- 在定义函数时,可以在函数内部编写文档字符串,文档字符串就是对函数的说明
- 长字符串:’’’ ‘’’
- 保留文本格式
- 作为一个多行注释
# 文档字符串:对函数以及类的说明及功能介绍
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
函数的作用域
• 作用域(scope) :指的是变量生效的区域
# 块级作用域
# Python中是没有块级作用域的,代码块里的变量,外部可以调用
if 1 == 1:
name = "老王"
print(name) # 老王
• 在Python中一共有两种作用域
- 全局作用域
name = "老王"
def f1(): # f2()执行结果为函数f1的内存地址,即ret=f1;
print(name) # 执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,
def f2(): # name=“老王”与f1()在一个作用域链,
name = "老张" # 函数内部没有变量是会向外找,所以此时变量name值为“老王”
f1()
f2() # 得 老王
• 全局作用域在程序执行时创建(顶格写),在程序执行结束时销毁
• 所有函数以外的区域都是全局作用域
• 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问
- 函数作用域
name = "老王"
def f1():
name = "老张"
def f2():
name = "老李"
print(name)
f2()
f1() # 得 老李 在函数未执行之前,作用域已经形成了,作用域链也生成了
• 函数作用域在函数调用时创建,在调用结束时销毁
• 函数每调用一次就会产生一个新的函数作用域
• 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问
命名空间
- 获取当前作用域的所有变量,并且以一个字典的形式返回出来
a = 1
b = 2
c = 3
s = locals()
print(s) # 得 {'a':1, 'b':2, 'c':3}
作业
- 1.用函数实现一个判断用户输入的年份是否是闰年的程序
1.能被400整除的年份
2.能被4整除,但是不能被100整除的年份
以上2种方法满足一种即为闰年
def fun(year):
if year % 400 == 0 or (year % 100 != 0 and year % 4 == 0):
print('你输入的是闰年')
else:
print('您输入的不是闰年')
fun(1924) # 得 输入的是闰年
声明:本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。
仅是个人意见,如有不足之处或者侵权,请留言!