1.今日内容大纲
一. 昨日内容回顾 1. 函数: 对功能或者动作的封装 定义: def 函数名(参数列表): 函数体(return) 调用: ret = 函数名(实参列表) 函数名就是变量名. 函数名的命名规则: 变量的命名规则; 1. 数字, 字母, 下划线组成 2. 不能数字开头, 更不能是纯数字 3. 不能用关键字 4. 不要用中文 5. 不要太长 6. 要有意义 7. 区分大小写 8. 建议使用驼峰或者下划线 函数的返回值:函数结束执行之后给调用方的结果 return: 只要函数运行到了return. 函数立即停止执行 1. 不写return. 默认返回None 2. 写了return 后面不跟值 3. return 值 返回一个结果 4. return 值, 值, 值, 值 返回多个结果. 返回的是元组 函数的参数: 1. 形参: 在函数定义的地方的变量 1. 位置参数 2. 默认值参数 2. 实参: 在函数调用的地方给函数传递的具体的值 1. 位置参数 2. 关键字参数 3. 混合参数 先位置. 后关键字 3. 传参: 把实参赋值给形参的过程叫传参 二. 作业讲解 三. 今日主要内容 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def func(*args, **kwargs): 在形参上用*,** 表示聚合. 实参表示打散 顺序: 位置 *args 默认值 **kwargs 2. 作用域 名称空间: 1. 内置 2. 全局 3. 局部 作用域: 1. 全局作用域: 内置+全局 2. 局部作用域: 局部 globals() 查看全局作用域中的内容 locals() 查看当前作用域中的内容 3. global nonlocal global: 在局部引入全局变量 nonlocal: 在局部, 引入离他最近的那一层的变量 复习: 平时作业 + 课上代码 预习: 1. 函数名的应用. 2. 闭包. 3. 迭代器.
2.练习
'''
day9 作业及默写
1,整理函数相关知识点,写博客。
2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
3,写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
4,写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者。
5,写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果。
6,写函数,接收两个数字参数,返回比较大的那个数字。
7,写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
8,写函数,此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
9,写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,然后将这四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中。
10,对第9题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。
11,写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。
12,写一个函数完成三次登陆功能,再写一个函数完成注册功能(升级题)
明日默写。
①,return的作用。
②,传参的几种方法,每个都简单写一个代码。
如,实参,按位置传参。
def func(x,y):
Pass
func(‘a’,’b’)
'''
# 2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
# def func(lst): # function
# # return lst[1::2]
#
# result = []
# for i in range(len(lst)):
# if i % 2 == 1:
# result.append(lst[i])
# return result
# 3, 写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5
# def func(obj):
# # if len(obj) > 5:
# # return True
# # else:
# # return False
# return len(obj) > 5
# 4, 写函数,检查传入列表的长度,如果大于2,将列表的前两项内容返回给调用者
# def func(lst):
# if len(lst) > 2:
# return lst[:2]
# 5, 写函数,计算传入函数的字符串中, 数字、字母、空格 以及 其他内容的个数,并返回结果 isalpha()
# def func(s=""):
# shuzi = 0
# zimu = 0
# kongge = 0
# qita = 0
# for c in s:
# if c.isalpha():
# zimu = zimu + 1
# elif c.isdigit():
# shuzi = shuzi + 1
# elif c.isspace():
# kongge = kongge + 1
# else:
# qita = qita + 1
# return shuzi, zimu, kongge, qita
#
# print(func("abcd1234@@@@ "))
# 6,写函数,接收两个数字参数,返回比较大的那个数字。
# def func(a, b):
# # if a > b:
# # return a
# # else:
# # return b
# return a if a > b else b
# 三目运算
# a = 100
# b = 20
#
# c = a if a > b else b
# print(c)
# 7, 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
# dic = {"k1": "v1v1", "k2": [11,22,33,44]}
# PS:字典中的value只能是字符串或列表
# def func(dic):
# for k, v in dic.items():
# if len(v) > 2:
# v = v[:2]
# dic[k] = v
# return dic
# 8, 8,写函数,此函数只接收一个参数且此参数必须是列表数据类型,
# 此函数完成的功能是返回给调用者一个字典,
# 此字典的键值对为此列表的索引及对应的元素。
# 例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
# def func(lst):
# if type(lst) != list:
# print("扔出去一个异常")
#
# dic = {}
# for i in range(len(lst)):
# dic[i] = lst[i]
# return dic
# 写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,
# 然后将这四个内容传入到函数中,此函数接收到这四个内容,
# 将内容追加到一个student_msg文件中
# def func(name, age, edu, gender="男"):
# f = open("student_msg", mode="a", encoding="utf-8")
# f.write(name+"_"+gender+"_"+age+"_"+edu+"\n")
# f.flush()
# f.close()
#
# # func("郑中基", "男", "50", "大本")
# # func("张学友", "男", "60", "大本")
#
# while 1:
# tiwen = input("请问是否要输入学生信息输入任意内容继续,输入Q退出:")
# if tiwen.upper() == 'Q':
# break
#
# name = input("请输入你的姓名:")
# gender = input("请输入你的性别:")
# age = input("请输入你的年龄:")
# edu = input("请输入你的学历:")
#
# gender = "男" if gender == "" else "女"
# func(name, age, edu, gender)
# 11 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(升级题)。
# import os
# def func(file_name, old, new):
#
# with open(file_name, mode="r", encoding="utf-8") as f1, \
# open(file_name+"_副本", mode="w", encoding="utf-8") as f2:
# for line in f1:
# line = line.replace(old, new)
# f2.write(line)
# os.remove(file_name)
# os.rename(file_name+"_副本", file_name)
# 12. 写一个函数完成三次登陆功能,再写一个函数完成注册功能. 用户信息写入到文件中
#
# def regist(username, password): # wusir
# # 1. 检查用户名是否重复
# f = open("user_info", mode="r+", encoding="utf-8")
# for line in f:
# if line == "": # 防止空行影响程序运行
# continue
# user_info_username = line.split("_")[0]
# if username == user_info_username: # 用户名重复了
# return False
# else:
# # 2. 写入到文件中
# f.write(username+"_"+password+"\n")
#
# f.flush()
# f.close()
# return True
#
# name, psw = input("请输入你的用户名:"), input("请输入你的密码:")
# print(regist(name, psw))
# def login(username, password):
# f = open("user_info", mode="r", encoding="UTF-8")
# for line in f:
# if line.strip() == username+"_"+password:
# f.close()
# return True
# else:
# f.close()
# return False
#
# for i in range(2, -1, -1):
# ret = login(input("请输入用户名:"), input("请输入密码:"))
# if ret:
# print("恭喜你. 登录成功")
# break
# else:
# print("用户名或密码错误, 还有%s次机会" % i)
tuple()
3.动态传参
# def chi(*food): # * 表示的是不定参数. 可以传递任意个信息 参数名是food, 接受到的是元组
# print("我要吃", food)
#
# chi("一锅大米饭", "一箱辣条", "一桶方便面", "4L可乐")
# chi("方便面")
# chi("一大锅米饭", "一小锅小米饭", "一箱辣条", "一桶方便面", "4L可乐")
# * 表接收位置参数的动态传参
# 传参的顺序
# 位置 *args 默认值 **kwargs
#
# 如果默认值参数在*args前面. 如果想让默认值生效. *args将永远接不到值
# def func( a, b, *args,c = 5): # arguments参数
# print(a, b, c, args)
#
# func(1,2,3,4,5,6,8,c = 10)
# 关键字的动态传参
# *args 位置参数 接收到的是元组
# **kwargs 关键字的动态传参, 接收到的是字典
# def func(**kwargs): # key word arguments
# print(kwargs)
#
# func(a=10, b=20, jay="周杰伦", jj="林俊杰")
# 无敌模式. 所有的参数都能接收
# def func(*args, **kwargs):
# print(args)
# print(kwargs)
#
# func(1, 2, 5, jj="陶喆", jay="zhoujielun", soup="胡辣汤")
# def func(*args): # 在这里. 其实相当于把传进来的参数做了一次聚合, 聚合成一个元组
# print(args)
#
# lst = "娃哈哈"
# func(*lst) # 在实参位置 * 表示打散, 打散的是可迭代对象
# def func(**kwargs): # ** 把接收到的关键字参数打包(聚合)成字典
# print(kwargs) # 一定是字典
#
# dic = {"张无忌": "明教教主", "谢逊": "金毛狮王", "范瑶": "光明右使"}
#
# # func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
# func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参
# 在形参上
# 1. 位置参数
# 2. 默认值参数
# 3. 动态参数
# 1. *args 位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
# 2. **kwargs 关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
# 3. def func(*args, **kwargs): 无敌传参
# 4. 顺序: 位置参数, *args, 默认值, **kwargs
# 5. 在使用的时候, 可以任意的进行搭配
# 4. 在实参上. *, **表示的打散. 在形参. *,** 表示聚合
4.名称空间
# 最开始会开辟一个自己的命名空间- 内置名称空间
# a = 10
# print(a)
# # 直接在py文件一个层面上是全局名称空间
# def func():
# hasakey = 10
# # 在函数内部属于局部名称空间
# func()
# 加载顺序: 内置 => 全局 => 局部
# 取值顺序: 局部 => 全局 => 内置
# a = 10 # 全局
# def func():
# # a = 20
# print(a)
#
# func()
# 作用域: 变量或者函数的声明周期
# 全局作用域: 全局名称空间+内置名称空间
# 局部作用域: 局部名称空间
# a = 10 # 全局
# def func():
# liuwei = "刘伟"
# 1. globals() 查看全局作用域中的所有内容
# qiao = "乔峰"
# def 抗收音机():
# bgm = "难念的经"
# print("娃哈哈")
# print(locals())
# 抗收音机()
# # print(globals()) # 查看全局作用域中的内容
# # print(locals()) # locals()查看的是当前作用域中的内容
5.函数掐套
# def func1():
# print("我是func1")
#
# def func2():
# print("我是func2")
# func1()
#
# def func3():
# func2()
# print("我是func3")
# func3()
# 这样的代码不是嵌套. 互相调用
# 函数可以互相嵌套
# def outer():
# def inner():
# print("我是内部")
# print("我是外部")
# inner()
#
# outer()
# def outer():
# print("我是外面的")
# def inner_1():
# def inner_2():
# print("我是里面的2")
# inner_2()
# print("我是里面的1")
# inner_1()
# print("我是外面的收尾")
#
# outer()
# a = 10
# def func():
# global a #表示在当前作用域中的使用的a是全局中的变量
# a = 20 # 所有的a都是外面的了
# print(a) # 现在只有看的权利
#
# print(a) # 10
# func() # 20
# print(a) # 20
# def outer():
# a = 10
# def inner():
# nonlocal a # 找的是局部当中, 离他最近的上层的那个变量
# a = 20
# print(a)
# print(a) # 10
# inner() # 20
# print(a) # 20
# outer()
# a = 1
# def fun_1():
# a = 2
# def fun_2():
# nonlocal a
# a = 3
# def fun_3():
# a = 4
# print(a)
# print(a)
# fun_3()
# print(a)
# print(a)
# fun_2()
# print(a)
# print(a)
# fun_1()
# print(a)
# global 引入全局变量, 可以定义全局变量
# nonlocal 引入局部中离他最近的外层变量
# def func():
# global a # 没有也得有. 自动帮你创建
# a = 20
#
# func()
# print(a)
6.其他
student_msg:
郑中基_男_50_大本
张学友_男_60_大本
刘德华_男_60_大本、
关之琳_女_60_大本
user_info:
alex_123456
wusir_456789
taibai_789123
sylar_779991