定义形式
函数是将一段具有独立功能的代码块整合到一个整体并命名,在需要的位置调用即可。
函数在开发过程中,可以更高效的实现代码重用。
# 定义形式
def 函数名(形参):
return
# 调用方法
函数名(实参)
return
的作用
- 函数返回值;
-
return
返回多个值def return_num()
return 1,2
result = return_num()
print(result) # (1, 2)
rerturn a, b
返回多个数据的时候,默认是元组类型;return
后面可以连接列表、元组或字典,以返回多个值。函数说明文档
```python定义形式
def 函数名(形参): “”” 说明文档 “”” 代码 ……
调用方法
help(函数名)
<a name="mbb3u"></a>
# 在函数体内修改全局变量
```python
a = 100 # 声明全局变量
print(a) # 100
def testA():
global a # 声明a是全局变量
a = 299 # 修改全局变量
print(a) # 299
def testB():
print(a)
def testC():
a = 200 # 局部变量
print(a)
testB() # 100
testC() # 200
testA() # 299
print(a) # 299
函数的参数
位置参数
调用函数时,根据函数定义的参数位置来传递参数。
- 传递和定义参数的顺序即个数必须一致。 ```python def user_info(name, age, gender) print(f”您的名字是{name},年龄是{age},性别是{gender}”)
user_info(“TOM”, 20, “男”)
<a name="d4fb7"></a>
## 关键字参数
函数调用时,通过"`**键=值**`"形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
- 函数调用时,**如果有位置参数,位置参数必须在关键字参数的前面**,但**关键字参数之间不存在先后顺序**。
```python
def user_info(name, age, gender)
print(f"您的名字是{name},年龄是{age},性别是{gender}")
user_info("TOM", age=20, gender="男")
user_info("小明", gender="男", age=21)
缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。
- 所有位置参数必须出现在默认参数前。 ```python def user_info(name, age, gender=”男”): print(f”名字是{name},年龄是{age},性别是{gender}”)
user_info(“Tom”, 20) # user_info(“Tom”, 20) user_info(“Rose”, 22, “女”) # 名字是Rose,年龄是22,性别是女
<a name="V5vBA"></a>
## 不定长参数(可变参数)
不定长参数也叫**可变参数**。**用于不确定调用的时有多少个参数的场景**。<br />此时,可以用**包裹(**`**packing**`**)位置参数**,或者**包裹关键字参数**来进行参数传递。
<a name="D4mLj"></a>
### 包裹位置参数
**传进的所有参数都会被**`**args**`**变量收集,它会根据传进参数的位置合并成一个元组**。
- **返回的是元组类型**。
```python
def user_info(*args):
print(args)
user_info() # ()空元组
user_info("Tom") # ('Tom',)
user_info("Rose", 18) # ('Rose', 18)
包裹关键字参数
无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
- 返回的是字典类型。 ```python def user_info(**kwargs): print(kwargs)
user_info() # {} user_info(name=”Tom”, age=19, id=110) # {‘name’: ‘Tom’, ‘age’: 19, ‘id’: 110}
<a name="sqtRw"></a>
# 拆包和交换变量的值
<a name="bYZjU"></a>
## 拆包
<a name="lz1Uz"></a>
### 元组拆包
```python
def return_num():
return 1, 2
num1, num2 = return_num() # 元组拆包
print(num1) # 1
print(num2) # 2
字典拆包
对字典进行拆包,取出来的是字典的**key**
值,再通过key查找对应的**value**
。
dict1 = {"name": "Tom", "age": 20}
a, b = dict1 # 取出key值
print(a) # name
print(b) # age
print(dict1[a]) # Tom
print(dict1[b]) # 20
交换变量的值
方法一(借助临时变量)
a = 1
b = 2
print(f"a={a}") # a=1
print(f"a={b}") # b=2
c = a
a = b
b = c
print(f"a={a}") # a=2
print(f"a={b}") # b=1
方法二(简化,推荐使用)
a, b = 1, 2
print(f"a={a},b={b}") # a=1,b=2
a, b = b, a
print(f"a={a},b={b}") # a=2,b=1
引用(类似于指针)
在Python中,值是靠引用来传递的。
可以通过**id()**
来判断两个变量是否为同一个值的引用。**id**
值是数据所在内存的地址标识(类似于指针)。
不可变类型—声明时内存空间已确定
# int类型(不可变类型)
a = 1
b = a
print(b) # 1
print(id(a)) # 打印数值1所在的内存地址----a指向1的地址
print(id(b)) # 打印数值1所在的内存地址----b指向1的地址
a = 2
print(id(a)) # 打印数值2所在的内存地址
print(id(b)) # 打印数值1所在的内存地址
可变类型—存储方式类似于链表,呈动态存储
# 列表(可变类型)
a = [10, 20]
b = a
print(b) # [10, 20]
print(id(a)) # 列表[10, 20]所在内存地址
print(id(b)) # 列表[10, 20]所在内存地址
a.append(30)
print(b) # [10, 20, 30]
print(id(a)) # 列表[10, 20]所在内存地址----没有变化
print(id(b)) # 列表[10, 20]所在内存地址
可变与不可变类型
所谓可变与不可变类型,指的是数据是否能够直接被修改,如果能,则是可变的,否则就是不可变的。