m = int(input('m = ')) n = int(input('n = ')) fm = 1 for num in range(1, m + 1): fm *= num fn = 1 for num in range(1, n + 1): fn *= num fmn = 1 for num in range(1, m - n + 1): fmn *= num print(fm // fn // fmn)
对于上面的代码来说,我们可以将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,我们只需要“调用”这个“函数”就可以了。
在了解了如何定义函数后,我们可以对上面的代码进行重构,所谓重构就是在不影响代码执行结果的前提下对代码的结构进行调整,重构之后的代码如下所示。
def factorial(num): """ 求阶乘 """ result = 1 for n in range(1, num + 1): result *= n return result m = int(input('m = ')) n = int(input('n = ')) # 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数 print(factorial(m) // factorial(n) // factorial(m - n))
from random import randint def roll_dice(n=2): """ 摇色子 n: 色子的个数 return: n颗色子点数之和 """ total = 0 for _ in range(n): total += randint(1, 6) return total def add(a=0, b=0, c=0): return a + b + c # 如果没有指定参数那么使用默认值摇两颗色子 print(roll_dice()) # 摇三颗色子 print(roll_dice(3)) print(add()) print(add(1)) print(add(1, 2)) print(add(1, 2, 3)) # 传递参数时可以不按照设定的顺序进行传递 print(add(c=50, a=100, b=200))
我们给上面两个函数的参数都设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以在上面的代码中我们可以用各种不同的方式去调用add
函数,这跟其他很多语言中函数重载的效果是一致的。
其实上面的add
# 在参数名前面的*表示args是一个可变参数 # 即在调用add函数时可以传入0个或多个参数 def add(*args): total = 0 for val in args: total += val return total
print(add()) print(add(1)) print(add(1, 2)) print(add(1, 2, 3)) print(add(1, 3, 5, 7, 9))
练习
1、定义一个简单的函数
def H(user): vip = ['123','456','789'] if user in vip: print("ok") else: print("error") user = input() H(user)
2、购买商品
def Check_Goods(g): G = ['汽车','火车','飞机'] if g in G: Address() else: return False def Check_Info(name,phone,Addr): is_ok=True if name=="" or name ==" ": is_ok = False if len(phone) !=11: is_ok = False if Addr not in ['北京','山东']: is_ok = False return is_ok def Address(): Name = input("姓名:") Phone = input("电话:") Addr = input("地址:") res = Check_Info(Name,Phone,Addr) if (res): Note() return False def Note(): print("马上发货") def Start(): print("欢迎光临") g = input("请输入商品:") Check_Goods(g) Start()
3、用户注册
count = 0 def users(): users_ = input('请输入用户名:') z = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM' n = '1234567890' t = '!@!$#%^&*' is_z = False is_n = False is_t = True for i in users_: if i in z: is_z = True if i in n: is_n = True if i in t: is_t = False if is_n and is_t and is_z: password() else: print('输入有误') def password(): passwd = input('请输入密码:') if len(passwd)<6: print('密码必须大于六位') else: phone() def phone(): p = input('请输入电话号:') if len(p) == 11: print('验证码已发送') vn() else: print('手机号为11位') def vn(): import random import time global count num = random.randrange(1000,9999) count += 1 start_time = time.time() print('东方智业:%d'%num) num_ = int(input('请输入验证码:')) end_time = time.time() sub_time = end_time - start_time if (sub_time > 3): if count > 2: print("验证码获取次数过多") exit() print("验证码超时,请重发。。。") time.sleep(2) vn() else: if num == num_: print("注册成功") else: print("验证码错误") def start(): users() start()