1、set 集合
创建set集合
# 创建一个集合 s1 = {11, 22} s2 = set() # 创建一个空集合。 s3 = set([11, 22, 33]
向集合中添加元素
s = set() print(s) s.add(123) # 往集合里添加一个元素。 s.add(123) # 重复查如是不允许的。 print(s)
clear 清除
# clear 清除 s.clear() print(s) # 返回为空。
difference
# difference A中存在,B中不存在。 s4 = {11, 22, 33} s5 = {22, 33, 44} s6 = s4.difference(s5) # A中存在,B中不存在的。 print(s6) # 返回值 {11} s7 = s4.symmetric_difference(s5) # 把相同的去掉,不同的留下。 print(s7) # 返回值 {11,44} s4.difference_update(s5) # 把最新产生的结果拿出来更新到s4。 print(s4) # 返回值 {11}
discard 移除选定的元素
# discard 移除选定的元素 s11 = {11, 22, 33} s11.discard(11) # 移除11,如果要移除的元素不存在,不移除,不报错。 print(s11) # 返回值 {33,22}
remove 移除指定元素
# remove 移除选定的元素 s12 = {11, 22, 33} s12.discard(11) # 移除11,如果要移除的元素不存在,报错。 print(s12) # 返回值 {33,22}
pop 随机移除并保存这个元素
# pop 随机移除某个元素并保存这个元素 s13 = {11, 22, 33} ret = s13.pop() # pop 里面不能加参数 print(ret)
intersection 取出A和B共有的元素
# intersection 取出A和B共有的元素 s14 = {11, 22, 33} s15 = {22, 33, 44} s16 = s14.intersection(s15) print(s16)
union 把A,B合并起来
# union 把A,B合并起来 s17 = s14.union(s15) # 并集 print(s17)
update 批量添加
# update 批量添加 s14 = {11, 22, 33} li = [1, 2, 3, 4] # 还可以添加字符串、元组 s14.update(li) print(s14) # 输出{33, 2, 1, 3, 4, 11, 22}
set 集合练习题
old_dict = { "#1": 8, "#2": 4, "#4": 2, } new_dict = { "#1" : 4, "#2" : 4, "#3" : 2, } """ 应该删除哪几个槽位 1、old_dict存在,new_dict中不存在的 key old_keys = old_dict.keys() old_set = set(old_dict) 把字典转化成集合 new_keys = new_dict.keys() new_set = set(new_keys) old_set.diffrents(new_set) 应该更新哪几个槽位 应该增加哪几个槽位 """ old_set = set(old_dict.keys()) # 字典转化成集合 new_set = set(new_dict.keys()) remove_set = old_set.difference(new_set) # 找出old_dict里面存在的,new_dict里面不存在的 add_set = new_set.difference(old_set) # 找出new_dict里面存在的,old_dict里面不存在的 update_set = old_set.intersection(new_set) # 找出两个字典的交集
2、 函数
def cjj():
1、def 关键字,创建函数
2、函数名
3、()
4、函数体
5、返回值
def sendmail(name, address, headline, content): import smtplib # 加载smtplib模块 from email.mime.text import MIMEText from email.utils import formataddr my_sender = 'cjj2859090483@163.com' # 发件人邮箱账号,为了后面易于维护,所以写成了变量 my_user = address # 收件人邮箱账号,为了后面易于维护,所以写成了变量 def sendmail(): ret = True try: msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = formataddr(["cjj.2859090483", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号 msg['To'] = formataddr([name, my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号 msg['Subject'] = headline # 邮件的主题,也可以说是标题 server = smtplib.SMTP("smtp.163.com", 25) # 发件人邮箱中的SMTP服务器,端口是25 server.login(my_sender, "sky.2859090483") # 括号中对应的是发件人邮箱账号、邮箱密码 server.sendmail(my_sender, [my_user], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 server.quit() # 这句是关闭连接的意思 except Exception: # 如果try中的语句没有执行,则会执行下面的ret=False ret = False return ret ret = sendmail() if ret: print("ok") # 如果发送成功则会返回ok,稍等20秒左右就可以收到邮件 else: print("filed") # 如果发送失败则会返回filed while True: name = input("请输入用户名:") address = input("请输入邮箱地址:") headline = input("请输入邮件标题:") content = input("请输入您要发送的内容:") result = sendmail(name, address, headline, content) if result == 'filed': print("发送失败") else: print("发送成功")
函数参数传递
def f1(a1, a2): return a1 + a2 def f1(a1, a2): return a1 * a2 ret = f1(8, 8) # ret 接收返回值 print(ret) # 函数执行a1 * a2, a1 + a2成为内存垃圾,在一定时间之后会被管理系统回收 ######################################################################## def f2(a1): a1.append(999) li = [11, 22, 44] ret = f2(li) # 函数参数传递的是引用,不是重新复制的一份数据 print(li)
全局变量
# 全局变量 在所有的作用域都可读 # 对全局变量进行重新赋值,需要global # 特殊:列表、字典,可修改,不可重新赋值 """ def f3(): name = 'cjj' print(name) def f4(): print(name) name 是私有变量,只能f1调用,f2不能调用 """ NAME = 'cjj' # 如果局部变量里面定义了跟全局变量相同的变量,先调用局部的变量,如果局部变量中没有,就调用全局变量 # 定义全局变量一定要大写(规定) def f1(): age = 18 # global NAME # 表示,name是全局变量,把name进行修改,对它重新赋值 NAME = 'chui' print(age, NAME) def f2(): age = 19 print(age, NAME) f1() f2()
动态参数(1) *args
# * 默认将传入的参数全部放置于元组中 # 形式参数前面加上一个*,那么就可以接收任意多个实际参数,并把它们转化成元组形式 def f1(*args): print(args) print(type(args)) f1(11, 22, 'cjj') # 把列表当成一个元素插进去 list = [11, 22, 33, 44, 'chui'] # 不管传进去的是什么,* 都把它转化成元组 f1(list, 3) f1(*list) # 实参上加 *,把列表转化成一个个的元素传进去 li = 'cjj' # 一个字符串作为实参 # 其实 * 的作用就是做一个for循环,把里面的元素遍历一边 f1(*li)
动态参数(2) **args
# ** 默认将传入的参数全部放置于字典中 # 参数的形参前面加 ** def f1(**args): # ** 的功能是把传递进去的元素转化成字典 print(args,type(args)) f1(n = "alex") # 既然转化成字典,就要往里面传递一个key,一个value dict = {1:'cjj',2:'chui'} f1(**dict) # 把字典传递进去,实质就是把字典循环,然后把一组组数据传递到定义的函数
lambda 计算简单函数
# lambda 只能用一行,简单的计算函数 def f1(a1): return a1 + 100 f2 = lambda a1, a2 = 9: a1 + 100 + a2 # 简化的函数,f2:函数名;a1:参数;a1+10:返回值;return被隐藏 ret = f1(10) print(ret) ret2 = f2(10) print(ret2)
几种常用的内置函数
# abs() 绝对值 n = abs(-1) print(n) #################################################### # all() 所有的元素都为真,输出真 # any() 有一个元素为真,输出真 # 0,None,"",[],() 都是假的 # print(bool()) 判断是真是假 n1 = all([1, 3, 4, None]) print(n1) # 输出 False m = any([1, 0, '', None]) print(m) ################################################### # bin() 接收十进制,把十进制转化成二进制 # oct() 接收十进制, 转化成八进制 # hex() 接收十进制,转化成十六进制 print(bin(5)) print(oct(9)) print(hex(15)) ################################################## # bytes() 字符串转化成字节 # utf-8 一个汉字:三个字节 # gbk 一个汉字:二个字节 # 字符串转换字节类型 # bytes(要转换的字符串, 按照什么方式转码) s = '吹静静' n2 = bytes(s, encoding="utf-8") # 把字符串 s 转化成 utf-8格式 print(n2) n2 = bytes(s, encoding="gbk") # 把字符串 s 转化成 utf-8格式 print(n2) # str() 字节转换成字符串 n3 = str(b'\xe5\x90\xb9\xe9\x9d\x99\xe9\x9d\x99', encoding="utf-8") print(n3)
万能参数 *args,**kwargs
# 必须是一个星的在前面,两个星的在后面 def f1(*args,**kwargs): print(args) print(kwargs) f1(11,22,33,k1 = 'cjj',k2 = 'chui') # 函数自动把前三个参数封装到*
默认参数
# 默认参数必须放在参数列表的最后面 def send(name, address, age = "ok"): # 形参 age 是默认参数,如果不输入内容,自动赋值为ok print(name, address, age) print("发送邮件成功:", name, address) return True send('cjj','大好人') # 实参 send('cjj', '大好人', '23')
注册与登陆
def login(username, password): """ 用于用户登陆 :param username: 用户输入的用户名 :param password: 用户输入的密码 :return: true,表示登陆成功;false,表示登录失败 """ txt = open('db','r') # 'r' 代表只读模式 for line in txt: line_list = line.strip().split("|") # strip() 移除空白及隐藏的换行符 if line_list[0] == username and line_list[1] == password: return True return False def register(username, password): """ 用于用户注册 :param username: 用户名 :param password: 密码 :return: 默认返回None """ txt = open("db",'a') # 'a' 代表添加 temp = "\n" + username + '|' + password txt.write(temp) txt.close() def main(): choose = input("1:登陆;2:注册") if choose == '1': username = input("请输入用户名:") password = input("请输入密码:") l = login(username, password) if l == True: print("登陆成功") else: print('登陆失败') elif choose == '2': username = input("请输入用户名:") password = input("请输入密码:") register(username, password) main()
3、文件操作
文件基本操作流程
# 1、打开文件 f = open('cjj', 'a') # 2、操作文件,通过源码查看功能 # 3、关闭文件 f.close() 或者 with open('cjj') as f: pass
文件读写操作——文件转码
f = open('cjj', 'r') # 如果文件打开出现乱码,很可能是文件保存方式有问题 # 改正:f = open('cjj', 'r', encoding="utf-8") 或者 f = open('cjj', 'r', encoding="GBK") data = f.read() print(data, type(data)) f.close() f = open('cjj', 'rb') # 加上 b 读到的是二进制,表现出来是字节类型 data = f.read() print(data, type(data)) f.close() f = open('cjj', 'ab') # 以字节的形式添加 f.write(bytes("吹静静", encoding="utf-8")) f.close() f = open('cjj', 'a', encoding='utf-8') f.write("吹静静") # 开头标注用“utf-8”格式,添加的是字符串 f.close()
文件操作 ——进阶
""" "+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+, 写读【可读,可写】 x+ ,写读【可读,可写】 a+, 写读【可读,可写】 """ # 如果打开模式为 r+ ,则read,按照字符读取;如果打开模式为 r+b ,则read,按照字节读取 f = open('cjj', 'r+', encoding='utf-8') # 读取第一个字符 data = f.read(1) # tell() 当前指针所在位置(永远是字节) print(f.tell()) # seek() 调整当前指针的位置(永远是字节) f.seek(f.tell()) # 从当前指针位置开始覆盖写入,不会移动后面数据的位置 f.write("666") # 如果不加seek,默认在最后面追加 f.close()
with
""" 当with代码块执行完毕时,内部会自动关闭并释放文件资源。 """ with open('cjj') as f: pass # with 可以同时打开多个文件 # 读取txt1 前十行,写到txt2中前十行 with open('txt1', 'r', encoding='utf-8') as f1, open('txt2', 'w', encoding='utf-8') as f2: times = 0 for line in f1: times += 1 if times <= 10: f2.write(line) else: break
4、str format 格式化输出
# str format 格式化输出 s = "i am {0}, age {1}".format("cjj", 23) # {0},{1}是占位符,意思是先占下一段空的内存 s = "i am {0}, age {1}".format(*["cjj", 23]) print(s) s1 = "i am {name},age {age}".format(name = 'cjj', age = 23) print(s1) dict = {'name': 'cjj', 'age': 23} s2 = "i am {name},age {age}".format(**dict) print(s2) """ 输出: i am cjj,age 23 i am cjj,age 23 i am cjj,age 23 """
5、三元运算
# 三元运算,三目运算 """ if 1 == 1: name = 'cjj' else: name = 'SB' """ name = 'cjj' if 1 == 1 else "SB" # 1==1 是一个判断条件,如果成立,name=cjj;如果不成立,name=SB