1.定义与调用
定义函数使用关键字def
调用函数需要使用
函数名加括号(如果函数需要参数那么则额外传递参数)
2.定义阶段
函数在定义阶段只检测函数体语法不执行函数体代码
(只要函数体代码本身没错就不会报错,但可能会有下划线)
3.调用阶段
函数名加括号调用函数的时候才会执行函数体代码
index() 什么是返回值? 返回值即执行完某个方法该方法反馈出来的结果
(根据需要可以使用return自己选择反馈出来的内容) 如何获取返回值? 通过变量名与赋值符号即可 变量名 = 方法/函数()
比如:
res = index()
print(res)
1.当函数体没有return关键字的时候 默认返回None def index(): print(‘from index‘) res = index() print(res) # None即空 表示没有 2.return关键字后面写什么函数就返回什么 def index(): print(‘from index‘) return 123 res = index() print(res) # 123 3.return后面跟多个值默认会组织成元组的形式返回 def index(): print(‘from index‘) return 123, 555, 66, 5, 4, 5, 4 res = index() print(res) # (123, 555, 66, 5, 4, 5, 4) 4.函数体代码遇到return立刻结束整个函数的运行 def index(): print(‘from index‘) return 123, 555, 66, 5, 4, 5, 4 print(‘from index‘) index()
# 1.无参函数:函数在定义阶段没有参数调用阶段也不需要参数 def index(): print(‘from index‘) index() # 2.有参函数:函数在定义阶段括号内填写了变量名即需要参数 def index(x): print(‘from index‘, x) index(1) # 3.空函数(没有具体的函数体代码) """一般用于前期的架构搭建""" def run(): pass # 补全语法结构 本身没有任何含义 def fight(): pass def talk(): pass
""" 函数在定义阶段括号内书写的变量名称之为函数的形式参数 简称为形参 函数的形参相当于变量名 函数在调用阶段括号内书写的值称之为函数的实际参数 简称为实参 函数的实参相当于变量值 两者在调用函数的时候临时绑定 函数运行结束分开 def index(name): 形参 name = ‘jason‘中的name print(name) index(‘jason‘): 实参 name = ‘jason‘中的jason print(‘jason‘) """ # 1.位置参数:按照位置一一对应传值 多一个不行少一个也不行 def index(x, y): print(x, y) index(1,2) ‘‘‘使用时,填写的参数数量必须保持和函数中一致,多了少了没有都会报错‘‘‘ # 2.关键字参数:指名道姓的给形参传值 可以打破位置限制 def index(x, y): print(x, y) index(y=111, x=222) index(111, y=222) index(111, x=222) #报错 print(y=111,222) #报错 ‘‘‘使用关键字参数也必须保证原函数中每个参数都有对应值,默认从左往右 而且使用关键字参数时,关键字参数必须在位置参数的后面‘‘‘ # 3.默认参数:函数在定义阶段就给形参赋值了 def register(name, age, gender=‘male‘): print(name, age, gender) register(‘jason‘, 18) register(‘tony‘, 28) register(‘kevin‘, 38) register(‘huahua‘, 18, ‘female‘) ‘‘‘通过在原函数中加默认值,可以让之后使用时,不填写有默认值的参数位子,自动使用默认的内容 如果填写了有默认值的参数格子,则填写的内容直接覆盖默认值‘‘‘ # 4.可变长参数(使用频率最高) ‘‘‘函数如何做到无论接收多少个位置参数都可以正常运行 *在形参中使用 会接收多余的位置参数组织成元组的形式赋值给*后面的变量名 ‘‘‘ def func(a, *b): print(a, b) func(1,2,3,4,5,6,7,8,9,10) #1 (2, 3, 4, 5, 6, 7, 8, 9, 10) func(1) #1 () """函数如何做到无论接收多少个关键字参数都可以正常运行 **在形参中使用 会接收多余的关键字参数组织成字典的形式赋值给**后面的变量名 """ def func(a,**b): print(a,b) func(a=1,b=2,c=3,d=4,e=5) #1 {‘b‘: 2, ‘c‘: 3, ‘d‘: 4, ‘e‘: 5} func(a=1) #func(a=1) # 小练习 定义一个函数 该函数无论接收多少个位置参数还是关键字参数都可以正常运行 def func(*a, **b): print(a, b) func(1, 2, 3, a=1, b=2, c=3) #(1, 2, 3) {‘a‘: 1, ‘b‘: 2, ‘c‘: 3} """ 约定俗成 针对形参中的可变长参数 变量名推荐使用 *args **kwargs def login(*args, **kwargs): pass """
l = [11, 22, 33, 44, 55] d = {‘username‘: ‘jason‘, ‘pwd‘: 123, ‘hobby‘: ‘read‘} def func(*args, **kwargs): print(args, kwargs) """ *在实参中使用 会将列表/元组内的元素打散成一个个位置参数传递给函数 """ func(*l) # func(11,22,33,44,55) """ **在实参中使用 会将字典内的元素打散成一个个关键字参数传递给函数 """ func(**d) # func(username=‘jason‘,pwd=123,hobby=‘read‘)
绝对值:print(abs(-111)) 相当于and:print(all([1, 2, 3, 4, 0])) 相当于and:print(any([1, 2, 3, 4, 0])) 二进制:print(bin(100)) 八进制:print(oct(100)) 十六进制:print(hex(100)) name = ‘jason‘ def index(): pass 判断变量是否可以调用 print(callable(name)) # False print(callable(index)) # True 返回ASCII码中数字对应的字符 print(chr(65)) # A 65-90 print(chr(122)) # z 97-122 format字符串格式化输出 print(‘my name is {} and my age is {}‘.format(‘jason‘,18)) print(‘my name is {0} {1} {1} and my age is {1} {0}‘.format(‘jason‘,18)) print(‘my name is {name} {name} {age} and my age is {age}‘.format(name=‘jason‘,age=18)) 增加加依次递增的数字前标 l = [‘jason‘, ‘kevin‘, ‘tony‘, ‘jerry‘, ‘tom‘] count = 1 for name in l: print(count,name) count += 1 for i, name in enumerate(l, 10): #10表示第一个的数值,默认是0 print(i, name) l = [11, 22, 33, 44, 55, 66, 77, 88, 99] 最大值:print(max(l)) 最小值:print(min(l)) 求和:print(sum(l))
函数封装版登陆界面
def register(): username = input(‘username>>>:‘).strip() password = input(‘password>>>:‘).strip() # 校验用户名是否存在 with open(r‘userinfo.txt‘, ‘r‘, encoding=‘utf8‘) as f: for line in f: real_name = line.split(‘|‘)[0] if real_name == username: print(‘用户名已存在‘) return # 函数中return相当于while循环中的break,所以直接跳到下一层 # 将用户名和密码写入文件 with open(r‘userinfo.txt‘, ‘a‘, encoding=‘utf8‘) as f: f.write(‘%s|%s\n‘ % (username, password)) print(‘%s注册成功‘ % username) def login(): username = input(‘username>>>:‘).strip() password = input(‘password>>>:‘).strip() with open(r‘userinfo.txt‘, ‘r‘, encoding=‘utf8‘) as f: for line in f: real_name, real_pwd = line.split(‘|‘) if real_name == username and password == real_pwd.strip(‘\n‘): print(‘登录成功‘) return print(‘用户名或密码错误‘) func_dict = {‘1‘: register, ‘2‘: login } # 这是个字典 while True: print(""" 1 注册 2 登录 """) choice = input(‘请输入执行功能编号>>>:‘).strip() if choice in func_dict: func_name = func_dict.get(choice) # func_name = 在字典中搜索了用户输入的内容 func_name() else: print(‘请输入正确的编号‘)
超级函数封装版登陆界面
def auth_username(username): # 校验用户名是否存在 with open(r‘userinfo.txt‘, ‘r‘, encoding=‘utf8‘) as f: for line in f: real_name = line.split(‘|‘)[0] if real_name == username: print(‘用户名已存在‘) return True return False # 此函数:根据输入的用户名判断用户名是否存在,存在则输出true,不存在则输出false def get_info(): username = input(‘username>>>:‘).strip() password = input(‘password>>>:‘).strip() return username, password # 此函数:收集用户打的用户名和密码,可以输出用户名和密码 def write_data(username, password): # 将用户名和密码写入文件 with open(r‘userinfo.txt‘, ‘a‘, encoding=‘utf8‘) as f: f.write(‘%s|%s\n‘ % (username, password)) print(‘%s注册成功‘ % username) # 此函数:将输入的用户名和密码写入后台(无论得到的用户名,密码对不对) def register(): username, password = get_info() # 调用校验用户名是否存在的函数 is_exist = auth_username(username) if is_exist: return write_data(username, password) ‘‘‘ 此函数:提取出get_info输出的用户名和密码,获取‘将它们输入auth_username‘得到的结果 如果得到true(重复的用户名),则此函数无效,如果得到false(不重复的用户名)则运行‘将用户名密码输入write_data‘ ‘‘‘ def login(): username, password = get_info() with open(r‘userinfo.txt‘, ‘r‘, encoding=‘utf8‘) as f: for line in f: real_name, real_pwd = line.split(‘|‘) if real_name == username and password == real_pwd.strip(‘\n‘): print(‘登录成功‘) return print(‘用户名或密码错误‘) # 此函数:提取出get_info输出的用户名和密码,和后台的用户名密码相比对,都相同则显示登陆成功,不然就显示用户名或密码错误 func_dict = {‘1‘: register, ‘2‘: login } # 这是一个字典 while True: print(""" 1 注册 2 登录 """) choice = input(‘请输入执行功能编号>>>:‘).strip() if choice in func_dict: func_name = func_dict.get(choice) func_name() else: print(‘请输入正确的编号‘) # 建立循环,显示1 注册 2 登陆,获取用户输入的内容,如果该内容在字典func_dict中,执行字典中对应的内容,不然就显示请输入正确的编号