函数定义与特性
将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需调用其函数名即可。使用函数可以减少重复代码,并使程序变得可扩展和易维护。
# 自定义函数的语法
def 函数名():
实现函数功能的代码块
函数的参数
形式参数 - 函数定义时使用的参数(可理解为在函数定义时使用的占位符)。
实际参数 - 调用函数时输入的参数(实参有实际的值)。
def sayhi(name,age): #name和age是形式参数
print(f"hello my name is {name},i am {age} years old..")
print("ddd")
sayhi("Aaliyah",23) #“Aaliyah”和23是实际参数
默认参数 - 可在函数调用时指定值,如未指定则使用默认值。默认参数一定要放在参数列表的最后,因为默认参数可以省略,如果放在非末尾的地方,解释器无法判断该参数是默认参数还是其他参数。
def stu_register(name,age,course,country="CN"): #country默认值为"CN"
print("----注册学生信息----")
print("姓名:",name)
print("年龄:",age)
print("国籍:",country)
print("课程:", course)
stu_register("王山炮",22,"pythong_devops") #如果没有指定值,则显示默认值
stu_register("张叫春",21,"linux",country="JP") #有指定值,显示指定值
stu_register("张叫阳",21,"linux","US") #不写参数名也可以
位置参数 - 通过位置确定参数赋值。向函数中输入参数时,需要和函数参数列表顺序相同。
关键参数 - 通过参数名确认参数赋值。关键参数必须放在位置参数的后面。关键参数的赋值一定要在位置参数的后面。
def stu_register(name,age,country,course):
print("----注册学生信息----")
print("姓名:",name)
print("年龄:",age)
print("国籍:",country)
print("课程:", course)
stu_register("王山炮",course = 'PY',age = 22,country = 'JP'") #关键参数带参数名,赋值顺序打乱也没关系
stu_register("王山炮",course = 'PY',22,country = 'JP'") #不可以这样!
stu_register("王山炮",22,age=25,country='JP') #age赋值两次,也不行
固定参数 - 向函数输入的参数个数是固定的。
非固定参数 - 向函数输入的参数个数是不固定的,参数列表的最后可以用*args或**kwargs占位。
# 使用*args 后续输入的参数以元组形式存储
def stu_register(name,age,*args):
print(name,age,args)
stu_register("alex",22) #输出:alex 22 ()
stu_register("alex",22,"M","girl",12345678900) #输出:alex 22 ('M', 'girl', 12345678900)
def stu_register_2(name,age,*args):
print(name,age,args[0])
stu_register_2("alex",22,"M","girl",12345678900) #输出:alex 22 M
函数返回值
return - 返回执行结果;函数遇到return代表执行结束,后续语句不再执行。
def stu_register(name,age,country,course):
print("----注册学生信息----")
print("姓名:",name)
print("年龄:",age)
print("国籍:",country)
print("课程:", course)
if age > 22:
return False
else:
return True
# 还可以这样
# return True, age, name, course
# 最后打印结果是一个元组:(True, 18, '王山炮', 'py')
#返回值;如果不返回,则是一个空值None
registriation_status = stu_register("王山炮",18,course="py",country='JP')
print(registriation_status)
if registriation_status:
print("注册成功")
else:
print("too old to be a student.")
局部变量与全局变量
在函数中定义的变量为局部变量,在程序的一开始定义的变量是全局变量。遇到变量名,先匹配局部变量,没有找到匹配的变量时才会匹配全局变啊领。一般来说,在函数中是不能够修改全局变量的。如果一定要在函数中使用全局变量,可以这样声明:
global name = "Aaliyah"
由于这样操作可能会导致变量混乱,非必须情况下不建议使用。
向函数传递列表、字典
一般来说,在函数中是不能够修改全局变量的,但有一种情况除外。当向函数传递列表、字典等非字符串、非数字类型变量时,在函数中也可以修改变量的值。原理:字典、列表内各元素地址独立,并不共享连续的内存空间。
附:常用内置函数
# abs() - 取绝对值
abs(-10)
abs(10)
# any() - 任意一个值为True,则返回True,否则返回False
b = [1,0,3,4,5,6,7]
any(b)
# chr() - 打印对应的ASCII码字符
chr(60)
#ord() - 与chr相反,输入一个字符,返回该字符的ASCII码
ord("<")
# dict
# - 生成空字典
print(dict()) #输出:{}
print(dict(name="alex",age=22)) #输出:{'name': 'alex', 'age': 22}
# dir() - 以列表的形式打印当前(作用域)的所有变量名
name = "alex"
age = 22
print(dir())
print(__file__)
# 输出:
# ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'age', 'name']
# locals() - 打印当前(作用域)所有变量名和变量值
name = "alex"
age = 22
print(locals())
# 输出:
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001A88DD51AF0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/hmy24/Desktop/python学习/学习使用pycharm/test测试.py', '__cached__': None, 'name': 'alex', 'age': 22}
# map() - 输入函数和列表,把列表中的每一个元素输入函数运行
l = list(range(10))
print(l)
def calc(x): #只能定义一个参数
return x **2
print(calc) #打印函数所在内存地址
m = map(calc,l) #并没有执行(迭代器)
print(m)
print("-------------")
for i in m: #真正执行,每循环一次,就把列表中的数据传给calc函数运算一次并返回结果
print(i)
# 输出:
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# <function calc at 0x000001E32BC3FF70>
# <map object at 0x000001E32BAF45B0>
# -------------
# 0
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64
# 81
# max() min() - 打印列表中的最大值
l = list(range(10))
print(max(l),min(l))
# 输出:9 0
# enumerate() - 输入一个列表,函数以元组形式输出列表的索引和对应数值
for index,val in enumerate(range(10)):
print(index,val)
# 输出:
0 0
# 1 1
# 2 2
# 3 3
# 4 4
# 5 5
# 6 6
# 7 7
# 8 8
# 9 9
# round() - 保留指定位数的小数,如果第二个参数未指定,默认不保留小数
print(round(3.1234567,2))
# 输出:
# 3.12
#sum() - 求和
print(sum([1,2,3]))
# 输出:
# 6
# zip() - 两个列表配对
a = ["nan1","nan2","nan3"]
b = ["nv1","nv2","nv3"]
for i in zip(a,b):
print(i)
# 输出:
# ('nan1', 'nv1')
# ('nan2', 'nv2')
# ('nan3', 'nv3')
# filter - 用于过滤序列,第一个参数为用以过滤的函数名,第二个参数为序列
l = list(range(10))
def compare(x):
if x>5:
return x
for i in filter(compare,l):
print(i)
# 输出:
# 6
# 7
# 8
# 9
# 做布尔值判断,返回True或False
bool(10)
bool(0)
bool(True)
bool(False)