python基础,python第三课
python基础的学习第三天,集合,三元运算,全局变量与局部变量,文件读写,字符编码和转换
集合
set,无序,不重复
三元运算
值1 if 条件 else 值2
1 a=2 2 b=3 3 name = a if a>b else b 4 print(name)
深浅拷贝
1、str,数字,深浅拷贝内存地址都是一样
2、其他类型
浅拷贝,拷贝只是拷贝最外面一层
深拷贝,拷贝除最内一层全部拷贝
python文件读写
1 #!_*_coding:utf-8_*_ 2 # __author__:"Ksen" 3 4 # 文件的操作方法,open() 5 # 1.打开文件 6 # 2.操作文件 7 # 3.关闭文件 8 # 9 # r,只读模式,默认是只读模式 10 # w,只写模式,文件不存在创建文件,文件存在覆盖文件再次写入 11 # x,只写模式,文件不存在创建文件,文件存在直接报错 12 # a,追加模式,存在的文件中追加写入文件,不存在的文件则创建文件 13 14 f1 = open("abc","r",encoding="utf-8") 15 data = f1.read() 16 f1.close() 17 print(data) 18 19 f1 = open("abcd","w",encoding="utf-8") 20 f1.write("abcd") 21 f1.close() 22 23 f1 = open("abcde","x",encoding="utf-8") 24 f1.write("abcd") 25 f1.close() 26 27 f1 = open("abcdef","a",encoding="utf-8") 28 f1.write("e") 29 f1.close() 30 31 # + 32 # r+,读写模式,从文件开始读取,写入从文件最后追加写入,指针移动到文件末尾 33 # w+,写读模式,首先清空文件,从文件开始读取,在文件末尾追加写入 34 # x+,写读模式,首先清空文件,从文件开始读取,在文件末尾追加写入,写入文件存在报错 35 # a+,写读模式,从文件末尾开始读取,在文件末尾追加写入 36 37 f1 = open("abcdef1","r+",encoding="utf-8") 38 print(f1.tell()) 39 f1.write("abasdfasdasd") 40 f1.readlines() 41 # f1.write("e") 42 f1.close() 43 44 # 常用文件操作 45 # f = open("abcdef1", "r", encoding="utf-8") 46 # f.read() # 读取文件所有内容 47 # f.readline() # 读取文件一行内容 48 # f.write() # 写入文件 49 # f.flush() # 从内存中直接刷到硬盘中 50 # f.seek() # 移动指针 51 # f.tell() # 获取指针 52 # f.close() # 关闭文件 53 # f.truncate() # 截取文件内容 54 # for line in f: #循环读取文件所有内容 55 # print(line) 56 57 #同时打开两个文件,将f1的内容复制到f2文件中 58 with open("abc",'r',encoding="utf-8") as f1,open("xxx",'w',encoding="utf-8") as f2: 59 for line in f1: 60 f2.write(line)
登录示例练习
1 #!_*_coding:utf-8_*_ 2 #__author__:"Ksen" 3 4 5 def alter_pwd(username,old_password,new_password): 6 """ 7 修改密码功能 8 :param username:用户名 9 :param old_password:旧密码 10 :param new_password:新密码 11 :return:True修改密码成功 12 """ 13 data = '' 14 with open("db","r+",encoding="utf-8") as f1: 15 for line in f1: 16 line = line.strip() 17 line_list = line.split(",") 18 if line_list[0] == username and line_list[1] == old_password: 19 line = line.replace(old_password,new_password) 20 data = data + line + "\n" 21 with open("db", "r+", encoding="utf-8") as f: 22 f.write(data) 23 return True 24 25 def login(username, password): 26 """ 27 账户登录功能 28 :param username: 登录用户名 29 :param password: 登录密码 30 :return: True登录成功,False登录失败 31 """ 32 f = open("db","r",encoding="utf-8") 33 for line in f: 34 strip_line = line.strip() 35 line_list = strip_line.split(",") 36 if username == line_list[0] and password == line_list[1]: 37 return True 38 return False 39 40 def register(username, password): 41 with open("db","a",encoding="utf-8") as f: 42 temp = "\n" + username + "," + password 43 f.write(temp) 44 return True 45 46 def user_exist(username): 47 """ 48 判断用户名是否存在 49 :param username: 用户名 50 :return: True,用户名存在,False,用户名不存在 51 """ 52 with open("db","r",encoding="utf-8") as f: 53 for line in f: 54 line = line.strip() 55 line_list = line.split(",") 56 if line_list[0] == username: 57 return True 58 return False 59 60 61 def del_account(username): 62 data = "" 63 with open("db","r",encoding="utf-8") as f: 64 for line in f: 65 line =line.strip().split(",") 66 if username != line[0]: 67 data += line[0]+","+line[1]+"\n" 68 else: 69 pass 70 with open("db","w",encoding="utf-8") as f: 71 f.write(data) 72 return True 73 74 def main(): 75 """ 76 程序主入口,主要实现,注册,登录 77 :return: 78 """ 79 while True: 80 flag = True 81 print("欢迎使用xxxx系统") 82 inp = input("1:注册,2:登录:,3:修改密码,4,删除用户") 83 while flag: 84 if inp == "1": # 注册 85 user = input("请输入用户名:") 86 pwd = input("请输入密码:") 87 is_exist = user_exist(user) 88 if is_exist: 89 print("用户名已存在,请重新输入") 90 continue 91 else: 92 is_register = register(user, pwd) 93 if is_register: 94 print("注册成功") 95 break 96 else: 97 print("注册失败,请重新注册") 98 continue 99 elif inp == "2": # 登录 100 user = input("请输入用户名:") 101 pwd = input("请输入密码:") 102 login_test = login(user, pwd) 103 if login_test == True: 104 print("登录成功") 105 break 106 else: 107 print("登录失败,请重新输入") 108 continue 109 elif inp == "3": # 修改密码 110 user = input("请输入用户名:") 111 pwd = input("请输入密码:") 112 login_test = login(user, pwd) 113 if login_test: 114 new_pws = input("请输入新密码:") 115 is_alter_pwd = alter_pwd(user, pwd, new_pws) 116 if is_alter_pwd == True: 117 print("修改密码成功") 118 break 119 else: 120 print("修改密码失败,请重新操作!!!") 121 continue 122 else: 123 print("登录失败") 124 continue 125 elif inp == "4": # 删除用户 126 user = input("请输入要删除的账号:") 127 is_exist = user_exist(user) 128 if is_exist: 129 is_del_account = del_account(user) 130 if is_del_account == True: 131 print("删除用户成功") 132 break 133 else: 134 print("删除失败!!!") 135 continue 136 else: 137 print("用户名不存在") 138 continue 139 else: 140 print("输入错误,请重新选择") 141 flag = False 142 143 main()
字符编码及编码转换
听得比较迷糊
引用:http://www.cnblogs.com/alex3714/articles/5717620.html
1.默认编码:
- python2默认编码是ASCII
- python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
以上图片适用python2.0
函数
函数的定义
定义:函数是指一组语句的集合通过一个函数封装起来的功能,执行该函数的功能,可以通过函数名称来调用
函数特性
- 减少重复代码
- 程序易扩展
- 程序易维护
函数语法定义
def func_test(x,y,z): #用def定义函数名,x,y,z函数的参数,也称为函数的形参 print(x) print(y) print(z) func_test(x=2,y=3,z=3) #通过函数名称来调用,括号里面参数称为实参
函数参数
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
默认参数
def stu_info(name,sex,age,city="北京"): #默认参数可以直接在参数里赋值 print("student info".center(20,"-")) print("name: ",name) print("sex : ",sex) print("age : ",age) print("city: ",city) stu_info("小明","男",22) #调用时可以不传默认参数 stu_info(sex="女",age=21,name="小红") #关键参数可不按顺序传值,但是和位置参数共同使用时,关键参数需要在位置参数的后面,位置参数必须按顺序传值 stu_info("小丽","女",city="天津",age=18)#默认参数可修改
非固定参数
不确定传入参数的个数,可以使用非固定参数
def account(phone,*args,**kwargs):# *ars传入的是一个元组tuple,**kwargs传入的是一个字典dict print(phone,args,kwargs) account(13912345678)# *args,**kwargs 非固定参数可以不传参数,默认为空
account(13912345678,"zhangsan","北京",addr="北京市海淀区中关村",iphone="13401065112")#位置参数之后的参数为*args,后面的关键参数为**kwargs 它们之间的顺序不能颠倒
全局变量和局部变量
在程序一开始定义的变量为全局变量,在子程序中定义的变量为局部变量
全局变量的作用域为整个程序,局部变量的作用域为子程序,出了这个子程序局部变量无效
当局部变量和全局变量同名时,在子程序内局部变量有效,在子程序外全局变量有效
全局变量:变量名大写,修改全局变量使用global
局部变量:变量名小写,应用在代码块内
NAME = "Ksen" #全局变量 def person(name): print("person name is ",name) name = "Lisi" #局部变量 print("person name is ",name) name="zhangsan" print("person name is ",name) person(name) print("My name is ",name)
函数传值
函数传参数,传的引用
def fun(args): args.append(333) a = [11,22] fun(a) print(a)
返回值return
return是函数的返回值,即是函数执行后返回的结果
1、如果函数没有返回值,则返回的是None
2、函数执行过程中遇到return则执行结束并返回
3、函数返回值可以返回int,str,list,dict等数据类型,还可以返回函数
匿名函数
一般函数def func(x,y):return x+y
匿名函数:lambda x,y: x+y
匿名函数详细解释见:http://blog.csdn.net/csdnstudent/article/details/40112803
isinstance 的使用
判断对象是否是xxx的数据类型,返回True或者Flase
isinstance(obj,数据类型)
作业
1、简述普通参数、指定参数、默认参数、动态参数的区别
2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
s1 = "abc123 23 sd233234asdf asd fas *(()12312+_?.<" def str_sum(s): int_sum = 0 str_sum = 0 space_sum = 0 other_sum = 0 for i in s: if i.isdigit(): int_sum += 1 elif i.isalpha(): str_sum += 1 elif i.isspace(): space_sum += 1 else: other_sum += 1 return (int_sum,str_sum,space_sum,other_sum) print(str_sum(s1))
3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
1 str_1 = "zhangsan" 2 list_1 = [11,2,3,None,5] 3 tup_1 = (1,3,"asdfa","sdafasdf",[list_1]) 4 def long(obj): 5 if isinstance(obj,str) or isinstance(obj,list) or isinstance(obj,tuple): 6 if len(obj) >= 5: 7 return True 8 else: 9 return False 10 return None 11 a = long(str_1) 12 b = long(list_1) 13 c = long(tup_1) 14 d = long(123) 15 print(a) 16 print(b) 17 print(c) 18 print(d) 19 20 print(len(str_1)) 21 print(len(list_1)) 22 print(len(tup_1))
4、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
1 str_1 = "zhangs an" 2 list_1 = [11,23,3,5] 3 tup_1 = (1,"","asd fa","sdaf asdf",1) 4 5 def isNone(obj): 6 res = True 7 for i in obj: 8 i = str(i) 9 # if i.isspace(): 10 if " " in i: 11 res = False 12 break 13 return res 14 15 print(isNone(str_1)) 16 print(isNone(list_1)) 17 print(isNone(tup_1))
5、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
1 def long_1(list_1): 2 if len(list_1) > 2: 3 return list_1[0:2] 4 return list_1 5 a = [11,22,33,44,55] 6 b = [22,33] 7 res = long_1(b) 8 print(res)
6、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
1 def fun1(agrs): 2 new_list = [] 3 for i in range(1,len(agrs),2): 4 new_list.append(agrs[i]) 5 return new_list 6 l1= [11,22,33,44,55] 7 t1 =("22","33",44,[22,22]) 8 res1 = fun1(l1) 9 res2 = fun1(t1) 10 11 print(res1) 12 print(res2)
7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
PS:字典中的value只能是字符串或列表
1 #第一种实现,保留原数据的值,创建一个新数据的值,一般情况下都使用这种方式实现,保留源数据,创建新数据 2 3 def fun2(args): 4 new_dic ={} 5 for k,v in args.items(): 6 if len(v) > 2: 7 new_dic[k] = v[0:2] 8 else: 9 new_dic[k] = v 10 return new_dic 11 dic_1 ={ 12 "k1":"11v1", 13 "k2":"22v2", 14 "k3":[11,22,33,44], 15 } 16 res = fun2(dic_1) 17 print(res) 18 #第二种实现 不创建新的数据,直接修改源数据 19 def fun3(args): 20 for k,v in args.items(): 21 if len(v) > 2: 22 args[k] = v[0:2] 23 else: 24 args[k] = v 25 dic_2 ={ 26 "k1":"11v1", 27 "k2":"22v2", 28 "k3":[11,22,33,44], 29 } 30 res2 = fun3(dic_1) 31 print(res2)