变量
python变量不需要类型和声明,直接用 = 赋值。
a = 1
b = "hello world"
c = ["test"]
多个变量赋值
a, b = 1, "hello"
x = y = 1
函数
函数定义
以 def 关键字定义函数名
函数名可以包含数字、字母、下划线
函数名后需要指定函数参数,括号“()”括起来,传参可以为空
参数列表后,以冒号开始函数体
函数体需要缩进
def func(name, age=1, *arg, **kwargs):
print(f"{name}: {age}")
return 0
函数参数
默认值参数
即为函数的参数指定默认值,当调用函数时此参数缺省,则赋值为默认值。这里需要特别注意,当传参是列表、字典等不可变对象时,会影响作用域外的值
例如
def func(value, array=[]):
array.append(value)
return array
if __name__ == '__main__':
array = []
print(func(1, array))
print(func(2, array))
print(func(3, array))
[1]
[1, 2]
[1, 2, 3]
关键字参数
函数调用时,可以通过指定关键字传递,而不需要关心顺序
def func(name, age):
print(f"name {name} age {age}")
if __name__ == '__main__':
func(name="小明", age=10)
func(age=20, name="大明")
name 小明 age 10
name 大明 age 20
函数调用时,关键字参数必须跟在位置参数后面。所有传递的关键字参数都必须匹配一个函数接受的参数。
最后一个形参为 **name
形式时,接收一个字典,该字典包含与函数中已定义形参对应之外的所有关键字参数。
def func(name="", **kwargs):
description = f"name {name}"
if "age" in kwargs:
description = f"{description} age {kwargs.get('age')}"
print(description)
if __name__ == '__main__':
func("小明", age=10)
func("小明", city="深圳")
name 小明 age 10
name 小明
特殊参数
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ----------- ---------- ---------- | | | | Positional or keyword | | - Keyword only -- Positional only
仅位置参数
特定形参可以标记为 仅限位置。仅限位置 时,形参的顺序很重要,且这些形参不能用关键字传递。仅限位置形参应放在 /
(正斜杠)前。/
用于在逻辑上分割仅限位置形参与其它形参。如果函数定义中没有 /
,则表示没有仅限位置形参。
位置或关键字参数
函数定义中未使用 /
和 *
时,参数可以按位置或关键字传递给函数
仅限关键字参数
把形参标记为 仅限关键字,表明必须以关键字参数形式传递该形参,应在参数列表中第一个 仅限关键字 形参前添加 *
。
def func(name, age, /, city, zone, *, street, number):
print(f"name {name} age {age} city {city} zone {zone}, street {street} number {number}")
if __name__ == '__main__':
func("小明", 10, "北京", zone="朝阳区", street="人民路", number=1)
func("小李", 10, "北京", zone="海淀区", number=2, street="解放路")
name 小明 age 10 city 北京 zone 朝阳区, street 人民路 number 1
name 小李 age 10 city 北京 zone 海淀区, street 解放路 number 2
任意实参列表
也有场景会在调用函数时,使用任意数量的实参。例如用*或**定义的函数参数
def print_args(name, *args):
arg_list = []
for arg in args:
arg_list.append(arg)
print(arg_list)
if __name__ == '__main__':
print_args("numbers", 1, 2, 3)
[1, 2, 3]
variadic 参数用于采集传递给函数的所有剩余参数,因此,它们通常在形参列表的末尾。*args
形参后的任何形式参数只能是仅限关键字参数,即只能用作关键字参数,不能用作位置参数。
def print_args(name, *args, description=""):
arg_list = []
for arg in args:
arg_list.append(arg)
print(arg_list)
print(name, description)
if __name__ == '__main__':
print_args("numbers", 1, 2, 3, description="描述")
[1, 2, 3]
numbers 描述
解包实惨列表
函数调用要求独立的位置参数,但实参在列表或元组里时,要执行相反的操作
换句话说,就是把需要传递的参数,用*操作符把实参从列表或元组解包出来,或是用**操作符把实参从字典里解出来
def print_person(name, age):
print(f"name {name} age {age}")
def print_range(start, stop):
print(f"start {start} stop {stop}")
if __name__ == '__main__':
array = [1, 10]
print_range(*array)
people = {
"name": "小明", "age": 10
}
print_person(**people)
start 1 stop 10
name 小明 age 10