比如之前写的代码,需要复用,就像上面写的身份证号,手机号生成,代码都比较长,使用的时候最好封装起来,通过调用来实现。这里就需要使用到函数。
定义函数
使用 def 关键字定义函数。
def funcname():
代码执行体
将生成身份证号码的操作分成前6位,中间8位,后4位,将这些操作放在不同的函数中。
import csv
import random
def china_code():
# 创建一个空的列表
all_code = []
# 读取 gb2260.csv 文件
with open(file='gb2260.csv', encoding='utf8', mode='r') as f:
# 使用csv 创建读取对象
cr = csv.reader(f)
for code in cr:
# print(code, type(code),code[0])
# 每次获取一个code 将code值存放在 all_code 中
all_code.append(code[0])
# 等文件读取完成之后 all_code中存放了所有的 code值
# print(all_code)
# 使用random 随机从 all_code 中选择一个
cd = random.choice(all_code)
print(f"随机选中地区码:{cd}")
# 函数外面调用函数
china_code()
函数的返回值
函数的返回值使用return关键字进行返回。类似于我们做接口上下游传参,当函数的结果在另外一个函数中有需要的时候,我们需要添加返回值。
现在有三个函数
生成手机号 函数的手机号 需要在 用户注册中使用,所以可以将 手机号作为返回值,
生成随机密码 需要在用户注册中使用, 所以可将密码作为返回值,
import random
def get_phone():
phone = random.randint(13000000000,13999999999)
# phone 这个变量的值需要在其他地方使用
return phone
def get_passwd():
passwd = random.randint(0,99999999)
# passwd 需要在其他地方使用到
return passwd
def register():
# 调用函数 获取函数的返回值
phone = get_phone()
passwd = get_passwd()
print(f"开始使用 {phone},{passwd} 进行注册")
# 调用函数
register()
执行 register()函数, 在函数内容有 调用 获取手机号,和获取密码的操作。可以看到执行结果。
返回值相关注意
一个函数中最终只能由一个return , 如果要返回的值很多,将值放在列表或者放在字典中返回。
生成手机生成2个手机,要将这2个都返回出去, 那就放在列表中统一返回。
下面这样是不行的
def get_phone():
phone1 = random.randint(13000000000,13999999999)
phone2 = random.randint(13000000000, 13999999999)
# phone 这个变量的值需要在其他地方使用
return phone1
return phone2
函数中运行的时候遇到return关键字就不再外下执行了。所以这里的 热return phone2 根本就不会执行
可以将这两个手机号放在列表中统一返回
import random
def get_phone():
phone1 = random.randint(13000000000,13999999999)
phone2 = random.randint(13000000000, 13999999999)
# phone 这个变量的值需要在其他地方使用
return [phone1,phone2]
phone =get_phone()
print(f"生成的手机号 {phone}")
执行结果
生成的手机号 [13734818591, 13999468261]
函数的参数
必填参数
还是生成手机号码这个函数,可以生成1个,也可以生成多个。
可以在调用函数的时候根据需要生成指定个数。
# n 表示参数,
def get_phone(n):
phones = []
for i in range(n):
phone = random.randint(13000000000,13999999999)
phones.append(phone)
# 将列表中的值返回
return phones
# n = 1
p = get_phone(1)
print(p)
# n = 10
p10 =get_phone(10)
print(p10)
- n 表示参数,可以换成其他的。但是要保持一致。
执行结果
[13383846658]
[13454548635, 13447491778, 13781963435, 13980747792, 13806693548, 13163962218, 13272271182, 13790946219, 13453519689, 13063126162]
如果不给参数传值,执行则会报错。
import random
# n 表示参数,
def get_phone(n):
phones = []
for i in range(n):
phone = random.randint(13000000000,13999999999)
phones.append(phone)
# 将列表中的值返回
return phones
# 如果 不给n传值。则会报错
get_phone() # 将会报错
报错提示:缺少一个必填参数。
在一个函数中,必填参数可以设置多个。比如下面定义函数。
def add(x,y):
return x+y
上面函数定义了两个必填参数 ,x, y 。 在调用函数的时候,需要传入具体的值。
默认按照位置传参
调用函数,默认传递参数的按照定义函数时参数的先后位置进行传参。
def add(x,y):
return x+y
# 默认按位置传参 1 传给x 2 传给y
a = add(1,2)
print(a)
指定参数名进行传参
我们在传递参数的时候,也可以指定参数名
def add(x,y):
return x+y
# 指定参数名
a1 = add(x=1,y=10)
print(a1)
# 指定参数名可以不按照顺序
a2 = add(y=10,x=2)
print(a2)
混合使用
也可以一部分按照位置传参,另一部分使用参数名传参。
这里需要注意:按照位置传参一定从第一个开始。
def add(x,y,z):
print(f"传入参数x值: {x}")
print(f"传入参数y值: {y}")
print(f"传入参数z值: {z}")
return x+y+z
a1 = add(1,z=10,y=2)
print(a1) # 13
# 这样传参是错误的。
a2 = add(y=2,z=10,1)
参数的默认值
在函数的时候,也可以给函数参数设置默认值。 比如说
def add(x=1,y=4):
return x+y
x=1, 表示x的默认值是1,
y=4, 表示y的默认值是4
在调用函数的时候, 参数有默认值,可以不传参。不传参的时候使用默认值。
def add(x=1,y=4):
print(f"传入的参数x {x}")
print(f"传入的参数y {y}")
return x+y
# 调用函数 不传值 使用默认值
a1 = add()
print(a1) # 5
# 可以覆盖x的值 5按照位置传参,会覆盖x的值
a2 = add(5)
print(a2) # 9
# 也可以只覆盖y的值, 因为y位置在后面,只能通过参数名传参
a3 = add(y=10)
print(a3) # 11
# 也可以覆盖所有值
a4 = add(3,10)
print(a4) # 13