函数
一、函数概述
1. 函数作用
封装重复代码,实现代码复用、统一维护,一处修改全处生效。
2. 函数四类
内置函数:
len()、list()、int(),直接调用标准库函数:
import导入模块后使用第三方库函数:安装库后导入使用
自定义函数:
def自行定义(本章重点)
二、函数定义与调用
1. 语法格式
def 函数名(形参列表): """文档字符串:函数说明""" 函数体 return 返回值
def执行时创建函数对象,函数名引用该对象无
return默认返回None;return执行后立刻结束函数调用格式:
函数名(实参),必须先定义再调用
#示例:三数求和 def add(a,b,c): """三个数字相加,返回和""" s = a+b+c return s res = add(10,20,30)
2. 形参&实参
形参:定义时括号内变量
(a,b),仅声明,无实际值实参:调用传入的数据
add(1,2,3),赋值给形参
3. 文档字符串
函数首行多行注释,用于说明功能、参数、返回值
def print_star(n): """根据n打印星号 :param n: 星号数量 :return: 星号字符串 """ return "*"*n help(print_star) #查看文档 print(print_star.__doc__)
4. 函数是对象
函数名本质是变量,指向堆中的函数对象,可赋值传递
def func():
print("test")
f = func
f() #等价func()三、变量作用域:全局/局部变量
1. 全局变量
函数外定义,整文件生效;函数内修改需global声明
a = 100 def f(): global a a = 300 f() print(a) #300
2. 局部变量
函数内部(含形参)定义,仅函数内可用;访问速度>全局变量
同名局部变量会屏蔽全局变量
a=100 def f(): a=50 #局部变量 print(a) f() print(a) #100
locals():查看当前局部变量字典globals():查看全局变量字典
四、参数传递(全为引用传递)
Python传参都是对象地址引用,分可变、不可变两类
1. 可变对象(列表/字典/集合)
函数内修改原对象,外部同步变化
lst = [10,20] def f(m): m.append(30) f(lst) print(lst) #[10,20,30]
2. 不可变对象(数字/字符串/元组)
内部重新赋值会生成新对象,不影响外部原值
n=100 def f(x): x +=200 #新建对象 f(n) print(n) #100
特例:元组内含可变子元素,修改子元素原元组同步变
t = (10,20,[5,6]) def f(m): m[2][0]=999 f(t) print(t) #(10,20,[999,6])
3. 浅拷贝&深拷贝(copy模块)
import copy #浅拷贝copy:新容器,子对象共用引用 a=[10,20,[5,6]] b=copy.copy(a) b[2].append(7) print(a) #[10,20,[5,6,7]] #深拷贝deepcopy:容器+所有子对象全部新建 c=copy.deepcopy(a) c[2].append(9) print(a) #[10,20,[5,6,7]]
浅拷贝:只复制外层容器,内层子对象共用地址
深拷贝:递归拷贝所有层级,完全独立
五、五种参数类型
1. 位置参数
实参按顺序一一对应,个数必须匹配
def f(a,b,c):pass f(1,2,3)
2. 默认值参数
形参设置默认,不传参则使用默认,必须放在位置参数后
def f(a,b,c=10): print(a,b,c) f(1,2) #1 2 10 f(1,2,30) #1 2 30
3. 关键字(命名)参数
按参数名传参,顺序随意
def f(a,b,c):pass f(b=2,a=1,c=3)
4. 可变参数
*args:接收多余位置参数,打包成元组**kwargs:接收多余关键字参数,打包成字典
def f1(a,b,*args):
print(a,b,args)
f1(1,2,3,4) #1 2 (3,4)
def f2(a,b,**kwargs):
print(a,b,kwargs)
f2(1,2,name="张三") #1 2 {'name':'张三'}
def f3(a,b,*args,**kwargs):pass5. 强制命名参数
*后面的形参,调用必须写关键字传参
def f(*a,b,c):pass f(1,b=2,c=3)
六、lambda匿名函数
单行简易函数,格式:lambda 参数:表达式,表达式结果自动return
f = lambda a,b:a+b print(f(2,3)) #5 #列表存储多个lambda func_list = [lambda x:x*2,lambda x:x*3] print(func_list[0](5)) #10
七、eval函数
字符串转表达式执行,有安全风险慎用
a=10;b=20
res = eval("a+b")
print(res) #30八、递归函数
函数内部自己调用自己;必备两点:终止条件 + 递归公式
#阶乘n! = n*(n-1)! def fact(n): if n==1: return 1 return n*fact(n-1) print(fact(5)) #120
缺点:大量创建函数对象,耗内存,大数据慎用
九、嵌套函数(内部函数)
函数里定义新函数,仅外层函数内可调用,用于代码封装、去重复
def outer():
def inner():
print("内部函数")
inner()
outer()nonlocal关键字
在内层函数修改外层局部变量(非全局),global修改全局变量
a=100 def outer(): b=10 def inner(): nonlocal b global a b=20;a=1000 inner() print(b) #20 outer() print(a) #1000
十、LEGB变量查找顺序
查找变量优先级(从近到远)
Local(当前函数局部) → 2.Enclosed(外层嵌套函数) →3.Global(全局) →4.Built-in(内置)
十一、作业完整代码
#1.反转整数 3245→5432 def reverse_num(n): s = str(n) return int(s[::-1]) print(reverse_num(3245)) #2.数列 m(n)=1/2+2/3+...+n/(n+1) def calc(n): s=0 for i in range(1,n+1): s += i/(i+1) return s #3.毫秒转时分秒 def ms_trans(ms): s = ms//1000 h = s//3600 m = (s%3600)//60 sec = s%60 return h,m,sec #4.三点求三角形面积(海伦公式) def tri_area(x1,y1,x2,y2,x3,y3): import math a=math.hypot(x1-x2,y1-y2) b=math.hypot(x2-x3,y2-y3) c=math.hypot(x1-x3,y1-y3) if a+b>c and a+c>b and b+c>a: p=(a+b+c)/2 area=math.sqrt(p*(p-a)*(p-b)*(p-c)) return area else: return "坐标无效,无法构成三角形" #5.海龟多点两两连线 import turtle def draw_line(point_list): t = turtle.Turtle() for i in range(len(point_list)): for j in range(i+1,len(point_list)): t.penup() t.goto(point_list[i]) t.pendown() t.goto(point_list[j]) turtle.done() #测试:draw_line([(0,0),(100,50),(200,-30)])
上一篇:面向对象
下一篇:python基础概念


