比如之前写的代码,需要复用,就像上面写的身份证号,手机号生成,代码都比较长,使用的时候最好封装起来,通过调用来实现。这里就需要使用到函数。

定义函数

使用 def 关键字定义函数。

  1. def funcname():
  2. 代码执行体

将生成身份证号码的操作分成前6位,中间8位,后4位,将这些操作放在不同的函数中。

  1. import csv
  2. import random
  3. def china_code():
  4. # 创建一个空的列表
  5. all_code = []
  6. # 读取 gb2260.csv 文件
  7. with open(file='gb2260.csv', encoding='utf8', mode='r') as f:
  8. # 使用csv 创建读取对象
  9. cr = csv.reader(f)
  10. for code in cr:
  11. # print(code, type(code),code[0])
  12. # 每次获取一个code 将code值存放在 all_code 中
  13. all_code.append(code[0])
  14. # 等文件读取完成之后 all_code中存放了所有的 code值
  15. # print(all_code)
  16. # 使用random 随机从 all_code 中选择一个
  17. cd = random.choice(all_code)
  18. print(f"随机选中地区码:{cd}")
  19. # 函数外面调用函数
  20. china_code()

函数的返回值

函数的返回值使用return关键字进行返回。类似于我们做接口上下游传参,当函数的结果在另外一个函数中有需要的时候,我们需要添加返回值。
现在有三个函数
函数 - 图1
生成手机号 函数的手机号 需要在 用户注册中使用,所以可以将 手机号作为返回值,
生成随机密码 需要在用户注册中使用, 所以可将密码作为返回值,

  1. import random
  2. def get_phone():
  3. phone = random.randint(13000000000,13999999999)
  4. # phone 这个变量的值需要在其他地方使用
  5. return phone
  6. def get_passwd():
  7. passwd = random.randint(0,99999999)
  8. # passwd 需要在其他地方使用到
  9. return passwd
  10. def register():
  11. # 调用函数 获取函数的返回值
  12. phone = get_phone()
  13. passwd = get_passwd()
  14. print(f"开始使用 {phone},{passwd} 进行注册")
  15. # 调用函数
  16. register()

执行 register()函数, 在函数内容有 调用 获取手机号,和获取密码的操作。可以看到执行结果。
image.png

返回值相关注意

一个函数中最终只能由一个return , 如果要返回的值很多,将值放在列表或者放在字典中返回。
生成手机生成2个手机,要将这2个都返回出去, 那就放在列表中统一返回。
下面这样是不行的

  1. def get_phone():
  2. phone1 = random.randint(13000000000,13999999999)
  3. phone2 = random.randint(13000000000, 13999999999)
  4. # phone 这个变量的值需要在其他地方使用
  5. return phone1
  6. return phone2

函数中运行的时候遇到return关键字就不再外下执行了。所以这里的 热return phone2 根本就不会执行
可以将这两个手机号放在列表中统一返回

  1. import random
  2. def get_phone():
  3. phone1 = random.randint(13000000000,13999999999)
  4. phone2 = random.randint(13000000000, 13999999999)
  5. # phone 这个变量的值需要在其他地方使用
  6. return [phone1,phone2]
  7. phone =get_phone()
  8. print(f"生成的手机号 {phone}")

执行结果

  1. 生成的手机号 [13734818591, 13999468261]

函数的参数

封装函数的时候,可以指定函数的参数来让函数的功能能丰富。

必填参数

还是生成手机号码这个函数,可以生成1个,也可以生成多个。
可以在调用函数的时候根据需要生成指定个数。

  1. # n 表示参数,
  2. def get_phone(n):
  3. phones = []
  4. for i in range(n):
  5. phone = random.randint(13000000000,13999999999)
  6. phones.append(phone)
  7. # 将列表中的值返回
  8. return phones
  9. # n = 1
  10. p = get_phone(1)
  11. print(p)
  12. # n = 10
  13. p10 =get_phone(10)
  14. print(p10)
  • n 表示参数,可以换成其他的。但是要保持一致。

image.png

执行结果

  1. [13383846658]
  2. [13454548635, 13447491778, 13781963435, 13980747792, 13806693548, 13163962218, 13272271182, 13790946219, 13453519689, 13063126162]

如果不给参数传值,执行则会报错。

  1. import random
  2. # n 表示参数,
  3. def get_phone(n):
  4. phones = []
  5. for i in range(n):
  6. phone = random.randint(13000000000,13999999999)
  7. phones.append(phone)
  8. # 将列表中的值返回
  9. return phones
  10. # 如果 不给n传值。则会报错
  11. get_phone() # 将会报错

报错提示:缺少一个必填参数。
image.png
在一个函数中,必填参数可以设置多个。比如下面定义函数。

  1. def add(x,y):
  2. return x+y

上面函数定义了两个必填参数 ,x, y 。 在调用函数的时候,需要传入具体的值。

默认按照位置传参

调用函数,默认传递参数的按照定义函数时参数的先后位置进行传参。

  1. def add(x,y):
  2. return x+y
  3. # 默认按位置传参 1 传给x 2 传给y
  4. a = add(1,2)
  5. print(a)

指定参数名进行传参

我们在传递参数的时候,也可以指定参数名

  1. def add(x,y):
  2. return x+y
  3. # 指定参数名
  4. a1 = add(x=1,y=10)
  5. print(a1)
  6. # 指定参数名可以不按照顺序
  7. a2 = add(y=10,x=2)
  8. print(a2)

混合使用

也可以一部分按照位置传参,另一部分使用参数名传参。
这里需要注意:按照位置传参一定从第一个开始。

  1. def add(x,y,z):
  2. print(f"传入参数x值: {x}")
  3. print(f"传入参数y值: {y}")
  4. print(f"传入参数z值: {z}")
  5. return x+y+z
  6. a1 = add(1,z=10,y=2)
  7. print(a1) # 13
  8. # 这样传参是错误的。
  9. 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