day9:函数

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)

 

posted on 2018-12-03 09:04  Lisa_Guo  阅读(127)  评论(0编辑  收藏  举报