1.函数的定义与调用
# 定义一个函数
def hello():
print("hello world")
def hello_name(name):
print("hello", name)
def area(a, b):
return a+b
# 调用函数
hello()
hello_name("siri")
print(area(2, 4))
2.参数传递
- 可更改对象与不可更改对象
(1)在python中,类型属于对象,变量是没有类型的,变量可以理解为是一个对象的引用,是一个指向对象的指针;
(2)可更改对象:数字、字符、元组,不可更改对象:列表、字典、集合;
(3)修改不可变对象的值时,实际上是重新生成了一个对象,原来的引用指向新生成的对象;
(4)修改可变对象的值时,实际上是直接修改了原来的值,引用没有变化;
(5)不可变对象传递参数时,传递过去的是他的值,在函数中修改这个值后,是新生成了一个对象,原来的变量还是指向原来的对象,所以原来的变量的值不会改变;
def test(b):
print(id(b))
b = b/2
print(id(b))
a = 1
print(id(a))
test(a)
C:\Users\max\Desktop\pythonStudy\venv\Scripts\python.exe C:/Users/max/Desktop/pythonStudy/demo.py
140707870840480
140707870840480
2393646856240
进程已结束,退出代码 0
(6)可变对象传递参数时,传递过去的是他本身,修改后这个变量的值也会改变。
def test(b):
print(id(b))
b[0] = 2
print(id(b))
a = [1, 2]
print(id(a))
test(a)
C:\Users\max\Desktop\pythonStudy\venv\Scripts\python.exe C:/Users/max/Desktop/pythonStudy/demo.py
1631128189056
1631128189056
1631128189056
进程已结束,退出代码 0
- 调用函数时参数种类
(1)必须参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
(2)关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
def print_it(name, age):
print(name, "is", age)
# 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值
print_it(age=8, name="Berry")
C:\Users\max\Desktop\pythonStudy\venv\Scripts\python.exe C:/Users/max/Desktop/pythonStudy/demo.py
Berry is 8
进程已结束,退出代码 0
(3)默认参数
调用函数时,如果没有传递参数,则会使用默认参数。
def print_it(name, age=18):
print(name, "is", age)
print_it("Berry")
C:\Users\max\Desktop\pythonStudy\venv\Scripts\python.exe C:/Users/max/Desktop/pythonStudy/demo.py
Berry is 18
进程已结束,退出代码 0
(4)不定长参数
# 加了星号*的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
def print_it1(*num):
print(num)
# 加了两个星号**的参数会以字典的形式导入
def print_it2(**num):
print(num)
# 声明函数时,参数中星号*可以单独出现,单独出现星号*后的参数必须用关键字传入
def print_it3(*, c):
print(c)
# 可以不传递变量
print_it1()
print_it1(1, 2, 3)
print_it2()
print_it2(a=1, b=2, c=3)
print_it3(c=1)
C:\Users\max\Desktop\pythonStudy\venv\Scripts\python.exe C:/Users/max/Desktop/pythonStudy/demo.py
()
(1, 2, 3)
{}
{'a': 1, 'b': 2, 'c': 3}
1
进程已结束,退出代码 0
(5)强制位置参数
- python3.8新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
3.匿名函数
- python 使用 lambda 来创建匿名函数
(1)lambda 只是一个表达式,函数体比 def 简单很多。
(2)lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
(3)lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
(4)虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
sum = lambda a, b: print(a+b)
sum(1, 2)
4.return语句
- 用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。
def test():
pass
print(test()) # None