1、定义
函数是实现某个功能的一段代码
2、作用
3、参数分类
3.1 按定义分
形参
函数定义的时候,指定的参数
实参
函数调用的时候,传递的参数
参数顺序要求
- 形参顺序
func01(必选参数,可变长位置参数,默认参数,可变长关键字参数) - 实参顺序
fun01(位置参数,关键字参数)
3.2 按形参分
a )必选参数
调用的时候一定要传的参数
def studentinfo(name, age, sex):
print(f"my name is {name},my age is {age},my sex is {sex}")
b )默认参数
提供默认值,调用时可填可不填
def studentinfo(name, age, sex="f"):
print(f"my name is {name},my age is {age},my sex is {sex}")
studentinfo("sc", 18)
studentinfo("sc", 18, "m")
c )可变长位置参数
>>> t1 = ("a","b","c")
>>> print(*t1)
a b c
def myargs(name, *num):
print(f"{name}:{num}")
print(type(num), *num)
myargs("hejin")
myargs("hejin", 1)
myargs("hejin", 1, 2)
myargs("hejin", 1, 2, 3)
结果:
hejin:()
<class 'tuple'>
hejin:(1,)
<class 'tuple'> 1
hejin:(1, 2)
<class 'tuple'> 1 2
hejin:(1, 2, 3)
<class 'tuple'> 1 2 3
d )可变长关键字参数
def myargs2(**num):
print(num)
print(**num)
myargs2(a=1, b=2)
3.2 按实参分
a )位置参数
按参数顺序依次传递
studentinfo("sc", 18, "f")
b )关键字参数
按key依次传递
def studentinfo(name, age, sex="f"):
print(f"my name is {name},my age is {age},my sex is {sex}")
studentinfo("sc", 18)
studentinfo("sc", 18, "m")
def studentinfo(name, age, sex):
print(f"my name is {name},my age is {age},my sex is {sex}")
studentinfo("hejin", sex="f", age=18)
练习:
def myargs3(*num):
num_sum = 0
l = len(num)
for i in num:
num_sum += i
print(f"{l}数之和为:", num_sum)
myargs3(1, 3, 4, 5, 5)
def myargs4(**num):
num_sum = 0
l = len(num.keys())
for i in num:
num_sum += num.get(i)
print(f"{l}数之和为:", num_sum)
myargs4(a=1, b=2, c=3, d=4)
3、 return 语句
退出函数,并且返回结果的 return可以有多个 return可以一次返回多个值 如果一个函数没有return语句,默认返回None return 后面不接任何表达式,也返回None
def maxnum(x, y):
print("return语句。。。。。")
if x > y:
print("return x")
return x
elif y > x:
print("return y")
return
return x, y
print("return end...")
result = maxnum(3, 4)
i, j = maxnum(5, 5)
print(f"结果:{result},i为{i},j为{j}")
print(f"结果:{result}")
4、匿名函数(lamada表达式)
不需要创建函数名 只能有一个表达式,不用写return
add2 = lambda x, y: x + y
print(add2(1, 3))
add3 = lambda *num: sum(num)
print(add3(1, 2, 3))
add4 = lambda **num: num
print(add4(a=1, b=2))
max_num = lambda a, b: a if a > b else b
max_num = lambda a, b:max(a,b)
max_num = lambda a, b: x > y and x or y
print(max_num(1, 2))
float_num = lambda a: float("%.2f" % a)
float_num = lambda a: round(x,2)
print(float_num(2.33333))
5、递归函数
自己调用自己,形成循环 定义出口条件,什么时候结束递归 通常把一个大问题通过寻找规律可以缩小规模的时候使用的
5.1 阶乘
def func01(n):
if n == 1:
return 1
return n*func01(n-1)
print(func01(3))
5.2 斐波拉契数列
def fblq(n):
if n == 1 or n == 2:
return 1
else:
return fblq(n - 1) + fblq(n - 2)
a = int(input("请输入数列项数:"))
str1 = ''
for i in range(a):
str1 += str(fblq(i + 1)) + ','
print(str1)
5.3 雌雄兔繁殖
1、2 月 1只 3、4月 2只 5、6月 4只 7、8月 8只
def rabbit(n):
if n == 1 or n == 2:
return 1
return rabbit(n - 2) * 2
print(rabbit(8))
6、参数传递
函数的参数传递本质上都是传递引用
6.1 不可变数据类型
def fun1(x):
print(x)
x = 100
print(x)
x = 1
fun1(x)
print(x)
6.2 可变数据类型
全局变量在函数里面虽然被修改了,但是引用的地址不变 参数定义的时候,默认参数避免定义成一个可变数据类型
def fun2(a):
print(a)
a[0] = 100
print(a)
a = [1, 2, 3]
fun2(a)
print(a)
def f(a=[]):
a.append(1)
print(a)
f()
f()
f()
结果:
[1]
[1, 1]
[1, 1, 1]
7、变量的作用域
若全局变量是不可变数据类型,在局部修改全局变量有效 要加global
def f():
global x
x = 5
x = 1
f()
print(x)
8、变量名的解析(LEGB)
- L 在本地变量中 --local
- E 在任意上层函数的作用域 Enclosing function locals
- G 在全局作用域 --global
- B 在内置作用域 --builtin
def f():
x = 2
def f2():
x = 3
print(x)
print(__name__)
f2()
x = 1
__name__ = "sc"
f()
9、注释
文档注释会放在help的描述信息里面 放在函数模块或类里面 第一个用三引号注释的内容
def f():
"""这里是文档注释"""
print("hello")
f()
print(help(f))
结果:
hello
Help on function f in module __main__:
f()
这里是文档注释
None
10、内建函数与工厂函数
内建:Python已经建好了,我们直接调用 内建函数
|