1,上一小节复习,文件是不能修改的,但是我们可以先打开原来的文件,读取line的过程中,先replace,然后再修改。
# 把文件中的每一行的Lisa换成Jack,因为Python中的文件是不能直接修改的,所以一般是先读,读的过程修改完写入一个新的文件, # 然后删除旧文件,写入新文件即可 with open("file.txt","r",encoding="utf-8") as f1, open("file_bak.txt","w+",encoding="utf-8") as f2: for line in f1: # 这儿不用read直接for line就可以 if "lisa" in line: # 这里的判断别忘了 line = line.replace("lisa","Jack") # 这儿不要忘了吧line赋值回去 # li.append(line) f2.write(line) # 打开后可以重复写的,清空只是open的那一瞬间会清空 # 删除文件和重命名文件 import os os.remove("file.txt") os.rename("file_bak.txt","file.txt")
2,定义函数def,如果定义的函数名,系统内已经有了得话,那么会执行我们自己定义的函数,所以命令不要用系统的关键字
3,函数的返回值return三种情况:没有返回值(不写return默认是None,但是我们一般不会写return None,我们会写return,结束一个函数的继续),返回一个值(可以返回任意的数据类型,只要返回就可以接收到,一个函数写多个return也是只执行其中一个),和返回多个值(可以用一个变量接收成一个元祖,也可以用多个变量接收,有多少个返回值就用多少个变量接收),return后面的函数就不在执行了,pass后面的代码还会执行。
4,传递参数也叫传参,实参,实际参数
def sum( *args ): print(*args) print(args) li=[1,2,3,4] sum(li) sum(*li) # 加上*代表打散,传参闭合,星号打散 运行结果: [1, 2, 3, 4] ([1, 2, 3, 4],) 1 2 3 4 (1, 2, 3, 4)
5,定义函数参数的顺序,与解释器约定好的,位置参数,*args,默认参数,**kwargs
def func(a,b=2,c=9): print(a,b,c) # 传参参考变量命名 func(1,3,5) # 默认参数可以按照关键字和和位置传 func(a=3,b=9,c=0)
运行结果:
1 3 5
3 9 0
def func(a,b,*args,default=1,**kwargs): print(a,b,args,kwargs) func(1,2,default=1,c=3,l=9) 运行结果: 1 2 () {'c': 3, 'l': 9}
6,动态参数有两种:*args,接收的是按照位置传参的值,组织成一个元祖,**kwargs,接收的是按照关键字传参的值,组织成一个字典
def func(**kwargs): print(kwargs) print(*kwargs) # 字典的key # print(**kwargs) # 不可以继续拆分了,所以会报错 # 传参参考变量命名 func(a=1,b=2,_s="333")
运行结果:
{'a': 1, 'b': 2, '_s': '333'}
a b _s
7,args和kwargs其实也可以叫做其他的名字,不过我们约定俗称都叫做args和kwargs,args只可以接收位置参数,kwargs只可以接收关键字参数
8,一个列表作为参数,站在实参的角度上,在一个列表前面加一个星号,就是把列表按照顺序打散。
li = [1,2,3,4,5] def func(*args): print(args) func(li[0],li[1],li[2],li[3],li[4]) # 这样比较麻烦,有没有比较简单的方法,有,还记得我们讲的打散吗? func(*li) 运算结果: (1, 2, 3, 4, 5) (1, 2, 3, 4, 5)
9,字典作为参数
dict1 = {"name":"lisa","age":22,"gender":"F"} def func(**kwargs): print(kwargs) func(**dict1) 运行结果: {'name': 'lisa', 'age': 22, 'gender': 'F'}
10,docstring 输入三个单引号或者三个双引号,加上函数的注释,函数的注释,单行,# 多行,三引号
def func(**kwargs): ''' 这一行注释函数是干啥的 :param kwargs:这儿写入参数的介绍 :return:这里写上返回值是啥,干啥用的 ''' print(kwargs) func(**dict1) # 双下函数: print(func.__name__) print(func.__doc__) 运行结果: {'name': 'lisa', 'age': 22, 'gender': 'F'} func 这一行注释函数是干啥的 :param kwargs:这儿写入参数的介绍 :return:这里写上返回值是啥,干啥用的
11,上一小节作业题,使用range倒叙打印出100到0
for i in range(100,-1,-1): print(i)
12,计算用户输入内容中索引为奇数,并且是数字的总的个数:
s = input(">>>") count = 0 for i in s: if s.index(i) % 2 ==1 and i.isdigit(): count += 1 print(count) 运行结果: >>>1234hkjl6789 4
13,
i =[11,22,33,44,55,77,88,90,56] # 大于66的保存在key1, 小于66的保存在key2 # 第一种写法: result= {} result.setdefault("key1",[]) # result["key1"] =[] # result["key2"] =[] result.setdefault("key2",[]) for i in li: if i < 66: result["key1"].append(i) else: result["key2"].append(i) print(result) # 第二种写法: for i in li: if i > 66: if "key1" not in result: # result.setdefault("key1") result["key1"] = [] result['key1'].append(i) else: if "key2" not in result: # result.setdefault("key1") result["key2"] = [] result['key2'].append(i) print(result) 运行结果: {'key2': [11, 22, 33, 44, 55, 56], 'key1': [77, 88, 90]}
14,录入用户名,密码,遇到敏感字符用同等数量的*替换
user_list = [ {"username":"lisa","password":123}, {"username":"jack","password":456} ] # python 对格式要求严格,不这样写的话,会无效的 invalid_name = ["jerk","idiot","stupid"] passwd = '' while 1: usrname = input(">>>") if usrname.upper() == "Q": break else: if usrname in invalid_name: # for i in usrname: # usrname = usrname.replace(i,"*") # 这儿不要忘了再赋值回去 usrname = usrname.replace(usrname,"*"*len(usrname)) #一样的效果 passwd = input("passwd") # 这儿注意不管上面替换不替换都要加入list user_list.append({"username":usrname,"password":passwd}) print(user_list)