玩蛇(Python)笔记之基础Part3
玩蛇(Python)笔记之基础Part1
一.集合
1.set 无序,不重复序列 {}创建,直接写元素
2.set功能 __init__()构造方法,,使用强制转换就会调用此方法
1 set1 = {'year', 'jiujiujiu'} 2 print(type(set1)) 3 # 创建集合 4 s = set() # 创建空集合 5 li = [11, 22, 11, 22] 6 s = set(li)
3.集合的基本操作
1 # 操作集合 2 s1 = set() 3 s1.add(123) # 添加元素 4 s1.clear() # 清空set 5 s2 = s1.copy() # 浅拷贝 6 s1.difference(s2) # s1中存在s2中不存在的元素 7 s1.symmetric_difference(s2) # 对称差集 去掉两个set中相同的元素 8 s1.difference_update(s2) # 同difference 不过会更新s1 9 s1.symmetric_difference_update(s2) # 同symmetric_difference 不过会更新s1 10 s1.discard(1111) # 移除指定元素 不存在不报错 11 s1.remove(1111) # 移除指定元素 不存在报错 12 s1.pop() # 移除随机元素并且获取此元素 13 s1.intersection(s2) # 取交集 14 s1.intersection_update(s2) # 取交集并更新 15 s1.issubset(s2) # 是否为子序列 16 s1.issuperset(s2) # 是否为父序列 17 s3 = s1.union(s2) # 取并集 18 s1.update(s2) # 接收一个可迭代对象循环调用add()
4.关于对象的内部特殊函数
1 li = [11, 22, 33] # list __init__ 2 li() # list __call__ 3 li[0] # list __getitem__ 4 li[0] = 123 # list __setitem__ 5 del li[1] # list __delitem__
5.set 小练习 更新字典
1 old_dic = { 2 '#1': 4, 3 '#2': 4, 4 '#4': 2, 5 } 6 new_dic = { 7 '#1': 4, 8 '#2': 4, 9 '#3': 2, 10 } 11 new_set = set(new_dic.keys()) 12 old_set = set(old_dic.keys()) 13 14 remove_set = old_set.difference(new_set) 15 add_set = new_set.difference(old_set) 16 update_set = new_set.intersection(old_set) 17 18 #再根据以上集合 来更新字典
二.函数
1.什么是函数
1 def f1(): # def关键字,创建函数 函数名 () 2 pass # 函数体 返回值 默认返回值是none
2.来个发送邮件函数
1 def sendMail(): 2 import smtplib 3 from email.mime.text import MIMEText 4 from email.utils import formataddr 5 try: 6 msg = MIMEText('内容', 'plain', 'utf-8') 7 msg['From'] = formataddr(["YEAR", 'yearzhou93@gmail.com']) 8 msg['To'] = formataddr(["揍你", '243132373@qq.com']) 9 msg['Subject'] = "主题" 10 11 server = smtplib.SMTP("smtp.gmail.com", 25) 12 server.login("yearzhou92@gmail.com", "year93926") 13 server.sendmail('yearzhou92@gmail.com', ['243132373@qq.com', ], msg.as_string()) 14 server.quit() 15 except: 16 return False 17 else: 18 return True 19 20 21 ret = sendMail() 22 if ret: 23 print('OK') 24 else: 25 print('faild')
3.函数变量
普通参数(严格按照顺序将实际参数传递给形式参数)
默认参数(必须放置到参数列表的最后)
指定参数(将实际参数赋值给指定的形式参数)
* 动态参数 默认将传入的参数放入一个元组中 f(*[11,22,3,4])每一个元素
** 动态参数2 默认将传入的参数放入一个字典中 f(**['1':11,'asdf':123])
万能参数 f(*args,**kwargs) *在前**在后
函数的参数进行传递的时候是引用还是值 是引用!!!!
全局变量 作用域问题 所有作用域都可读!! 重新赋值得加上global关键词 特殊的是列表字典可修改但不能重新赋值因为是引用 全局变量大写约定俗成
1 def sendMail1(xxoo, content, xx='biubiubiu'): # 形式参数和默认参数 默认参数必须要放到参数列表最后!!! 2 import smtplib 3 from email.mime.text import MIMEText 4 from email.utils import formataddr 5 try: 6 msg = MIMEText(content, 'plain', 'utf-8') 7 msg['From'] = formataddr(["YEAR", 'yearzhou93@gmail.com']) 8 msg['To'] = formataddr(["揍你", '243132373@qq.com']) 9 msg['Subject'] = "主题" 10 11 server = smtplib.SMTP("smtp.gmail.com", 25) 12 server.login("yearzhou92@gmail.com", "year93926") 13 server.sendmail('yearzhou92@gmail.com', [xxoo, ], msg.as_string()) 14 server.quit() 15 except: 16 return False 17 else: 18 return True 19 20 21 ret = sendMail1('243132373@qq.com', 'SB') # 普通参数 默认参数 22 23 while True: 24 em = input("输入邮箱地址:") 25 ret1 = sendMail1(em, 'SB') 26 if ret: 27 print('ok') 28 else: 29 print('doubi') 30 31 sendMail1(content='jjj', xxoo='jjj') # 指定参数传参 32 33 34 def f2(*args): # 将接收的n个参数放到一个元组李里 35 print(args) 36 37 38 f2(11, 22, 33, 44, 'asdfasdf') 39 li = [11, 22, 33, 44, 55, 'asdfasdf'] 40 f2(li) # 将此列表作为元组的一个元素 41 f2(*li) # 将此列表所有元素作为元组的一个元素 *其实是对li做一个循环将每个元素分离出来 42 43 44 def f3(**args): # 45 print(args, type(args)) 46 47 48 f3(name='year') # 传入键值对作为字典 49 dic = {'name': 'year', 'age': 23} 50 f3(kk=dic) # 将dic作为一个元素 51 f3(**dic) # **可以循环将dic里的每一个键值对分离出来 52 53 54 def f4(*args, **kwargs): # 万能参数 55 print(args) 56 print(kwargs) 57 58 59 # string的format格式化输出 60 a = 'i am {0},age{1}'.format(*["alex", 234]) 61 b = 'i am {name},age{age}'.format(**{'name': 'year', 'age': 123}) 62 63 64 # 函数的参数进行传递的时候是引用还是值 是引用!!!! 65 def f5(list1): 66 list1.append(999) 67 68 69 li = [111, 222, 333, 444] 70 f5(li) 71 print(li) 72 73 # 全局变量 74 name = 'year' 75 76 77 def f6(): 78 # name = 'jiujiujiu' 79 global name 80 name = 'jiujiujiu' 81 # 特殊情况 列表字典 82 li.append('adsf') # 可修改 83 global li # 重新赋值得用global 84 # li = 'jiujiujiu' 85 86 87 print(name)
4.函数式编程小练习
1 # -*- coding:utf-8 -*- 2 # Author:YEAR 3 4 5 def login(user, pwd): 6 """ 7 用于用户登录 8 :param user: 用户输入的用户名 9 :param pwd: 用户输入的密码 10 :return: true表示成功 False表示失败 11 """ 12 f = open("db", 'r') 13 for line in f: 14 line_list = line.strip().split("|") 15 if line_list[0] == user and line_list[1] == pwd: 16 return True 17 return False 18 19 20 def register(user, pwd): 21 """ 22 用于用户注册 23 :param user: 用户名 24 :param pwd: 密码 25 :return: True注册成功 26 """ 27 f = open("db", 'a') 28 temp = user + "|" + pwd 29 f.write(temp) 30 return True 31 32 33 def main(): 34 t = input("1:登录;2:注册") 35 if t == '1': 36 user = input("请输入用户名") 37 pwd = input("请输出密码") 38 r = login(user, pwd) 39 if r: 40 print("登录成功") 41 else: 42 print("登录失败") 43 else: 44 user = input("请输入用户名") 45 pwd = input("请输出密码") 46 r = register(user, pwd) 47 48 49 main()
三.三元运算lambda表达式内置函数
1.三元运算,三目运算 简单的ifelse可以用此方式
2.lambada表达式 简单的function可以用此方式
3.一些内置函数
1 name = 'year' if 1 == 1 else 'SB' 2 # 1.2lambada表达式 简单的function可以用此方式 3 f2 = lambda a1: a1 + 100 4 # 2.1内置函数 5 # abs()绝对值 6 n = abs(-1) 7 # all() any() 0,None 负数 空字符串 空列表 空字典 空元组是false 8 # all接收一个可迭代的对象 有一个是假就是假 所有为真才是真 any为任何一个为真就是真 9 n = all([11, 22, 33, 44, '']) 10 n = any([11, 22, 33, 44, 55]) 11 12 13 # ascii() #自动执行对象的__repr__方法 14 class Foo: 15 def __repr__(self): 16 return "111" 17 18 19 n = ascii(Foo()) 20 21 # bin() oct() hex() 分别接收十进制转换成2进制8进制16进制 22 print(bin(5)) 23 print(oct(7)) 24 print(hex(9)) 25 # utf-8编码一个汉字三个字节 gbk一个汉字两个字节 26 # 字符串转换成字节类型 用bytes() 27 print(bytes('周', encoding='utf-8')) 28 # 字节转换成字符串 用str 29 print(str(bytes('周', encoding='utf-8'), encoding='utf-8'))
四.文件操作
1 # -*- coding:utf-8 -*- 2 # Author:YEAR 3 # 打开文件 4 f1 = open('db', 'r', encoding='utf-8') # 只读 encoding参数告诉python转化编码 5 data = f1.read() 6 print(data, type(data)) # 读出的为字符串类型,python默认做了编码转换将字节转换成了字符串,, 7 f1.close() 8 f1 = open('db', 'rb', encoding='utf-8') # b表示2进制打开不要python做编码转换,写也一样 9 data = f1.read() 10 print(data, type(data)) # 读出的类型为字节类型 11 f1.close() 12 13 f2 = open('db', 'w') # 只写 先清空源文件 14 f3 = open('db', 'x') # 如果文件存在报错,,不存在创建并写内容 15 f5 = open('db', 'a') # 追加 16 # +号 文件以可读可写打开 17 f1 = open('db', 'r+', 18 encoding='utf-8') # 文件位置指针 打开时在最开始 读完后 指针在最后,,再去写的时候会写在最后 python只要你读指针必会变到最后!! 所以写一般用r+不用a+ 也不用w+ w会清空 19 20 data = f1.read() # read会按模式去读!!! 21 print(data, type(data)) 22 f1.seek(1) # seek会强行调整文件位置指针位置, 在其中某个位置写会覆盖其后的内容!!!! 永远是按字节方式找位置 23 f1.read(1) 24 f1.tell() # 获取当前文件指针位置 25 f1.seek(f1.tell()) # 调整指针到指定位置 26 f1.write('888') 27 f1.close() 28 29 # 操作文件 30 f2.read() # 无参数读全部 如果有参数 b按字节无b按字符 31 f2.tell() # 获取当前指针位置 32 f2.seek(1) # 跳转指针位置 永远按字节 33 f2.write('ss') # 打开方式有关 有b只能写字节 无b写字符串 34 f2.fileno() # 文件的数字形式描述符 35 f2.flush() # 强刷 将写的内容强制刷新到硬盘上 close()会自动刷新 36 f2.isatty() # 是否是tty设备 37 f2.readable() # 是否可读 38 f2.seekable() # 是否可移动指针 39 f2.readline() # 只读一行 40 f2.truncate() # 从文件指针位置截断数据 后面的删除 41 42 for line in f2: # 迭代文件 一行一行 43 pass 44 # 关闭文件 45 f1.close() 46 with open('db', 'a') as f4: 47 pass 48 with open('db', 'a') as f6, open('db2', 'a') as f7: 49 for line1 in f6: 50 new_str = line1.replace('alex', 'st') 51 f7.write(new_str) 52 pass