- 函数是一段具有特定功能的代码的集合。
- 函数的目的主要在于降低编程难度与增加代码复用。
- 一组语句等价于一个函数,,需要使用这组语句的地方直接调用函数名即可。
- 函数的定义也叫函数的声明,定义后的函数不能直接运行需要通过调用
python使用保留字def定义函数
def 函数名(参数):
函数体
return(返回值列表)
- 函数遇见return会立即返回退出,不会执行函数内return下边的代码
- 没有设置返回值时,默认的返回值时null
- return只能返回一个值
- 不需要定义参数类型,因为python是弱数据语言
- def print_hi():
- print("helo world")
- print_hi()
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.28/函数.py
helo world
- a=0
- def hello():
- print("hello world!!")
- global a
- a+=1
- for i in range(0,4):
- hello()
- print(f"一共运行了{a}遍")
- :每当一个程序被调用的时候 ,会立刻在内存中形成一个执行栈(先进后出),函数调用的时候会把堆中函数程序地址压入栈中,函数执行完毕会立刻弹栈。
- 磁盘:存储数据的地方,cpu不可能直接从磁盘读取数据,因为读写速度慢。
- 内存:可以理解为一个缓冲区,内存读写速度快。
- 比如,要运行一段程序,程序在磁盘中存着,将磁盘中的程序加载到内存中向CPU提供数据
- 函数存放到堆中,因为栈的空间有限,
- 局部变量在被函数调用的时候会被压入栈中,函数执行完毕会出栈,失去内存地址,访问不到局部变量
运算器+控制器=cpu
存储器=内存+磁盘
- def t(a,b):
- a+=6
- b+=2
- x=1
- y=9
- t(x,y)
- print(x)
- print(y)
函数外的X,Y没有改变
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/值传递与引用传递.py
1
9
- def k(a):
- a.append("zhang")
-
- list1=[1,2,3,5,"tyu"]
- k(list1)
- print(list1)
数组在函数中被修改,是因为地址被传回去了
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/值传递与引用传递.py
[1, 2, 3, 5, 'tyu', 'zhang']
- def isvalid(a,b,c):
- if a+b>c and a+c>b and b+c>a:
- return 1
- else:
- print("错误")
- return 0
- def valid(a,b,c):
- if isvalid(a,b,c)==1:
- p=0.5*(a+b+c)
- v=(p*(p-a)*(p-b)*(p-c))**0.5
- print(f"三角新面积为:{v}")
- else:
- pass
-
- a,b,c=eval(input("enter three num="))
- valid(a,b,c)
大多情况下,该参数值不需要改变,书写位置一般在正常参数后面,方便用户调用函数
- def t(a,b=5):
- return a+b
- a,b=eval(input("enter the num="))
- k=t(a)
- print(k)
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/默认参数.py
enter the num=1,3
6
若指向列表:
- def test(num=[]):
- num.append("zhangsan")
- print(num)
- test()
- test()
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/默认参数.py
['zhangsan']
['zhangsan', 'zhangsan']
注意:默认参数指向不可变数据类型
返回一个元组
- def s(a,b,*c):
- print(f"c={c}")
- sum=a+b
- for i in c:
- sum+=i
- return sum
- print(f"sum={s(1,1,2,2,3)}")
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/可变参数.py
c=(2, 2, 3)
sum=9
让第一个参数不是数组
如果说传进去的是元组或者列表,只需要在元组或者列表前加*,就会把元组或列表作为可变参数传进去
- def s(*c):
- print(f"c={c}")
-
- a=[6,9,0]
- print(s(*a))
- print(s(a))
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/可变参数.py
c=(6, 9, 0)
None
c=([6, 9, 0],)
None
将键值对传回去
- def x(name,age,**kw):
- print(f"name={name},age是{age},其他是{kw}")
-
- # x("zhangsan",13,job="画家",hobby="sing")
- d={"job":"漫画家","hobby":"画画睡觉吃饭"}
- x("zhangsan",13,**d)
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/关键字参数.py
name=zhangsan,age是13,其他是{'job': '漫画家', 'hobby': '画画睡觉吃饭'}
- def t():
- print("test1----")
-
- def t2(fn):
- fn()
- print("test2~~~")
- t()
- t2(t)
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
test1----
test1----
test2~~~
lambda 参数[参数]:函数
- def t2(fn):
- fn()
- print("test2~~~")
- t2(lambda:print("佳人们谁懂"))
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
佳人们谁懂
test2~~~
- def t2(fn):
- print(fn(1,4))
- print("test2~~~")
- t2(lambda a,b:a+b)#自动返回,不用return
结果:
PS E:\学习笔记\Python> & E:/Python/python.exe e:/学习笔记/Python/3.29/函数参数.py
5
test2~~~