'''l.sort() sort不带参数, 升序排序reverse 布尔类型: true:降序排序, false: 升序排序, 默认值是falsekey 比较函数, 默认是按照数据类型比较(整数,默认int)'''l = [10, 0, 1, 6, 12, 8]l.sort(key=str)print(l)t = (10, 0, 1, 6, 12, 8)nt = sorted(t, reverse=True, key=str)print(nt)print(t)'''sort是列表的方法, sorted是全局方法sort会改变原有对象的数据, sorted不会改变原有数据而是返回一个新对象sort只能排序列表, sorted可以排序列表/元组sorted返回的数据类型是列表reverse 布尔类型: true:降序排序, false: 升序排序, 默认值是falsekey 比较函数, 默认是按照数据类型比较(整数,默认int)''''''10 0int: 10 0str: str(10),str(0),str(1),str(6),str(12),str(8) ==> ['10', '0', '1', '6', '12', '8'] 排序后: ['0','10']'1a' '12'''''''ASCII表参考地址: https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81%E8%A1%A8&fromid=19660475&fr=aladdin主要掌握知识点:1. 0 a A 在ASCII中的编码2. ASCII使用16进制的表示形式: 如\x01''''''集合的元素 只能是不可变类型, 不能是可变类型字典的键 只能是不可变类型, 不能是可变类型改变指的是内存中数据的改变a-> 0x001(内存空间)不可变类型: int/float/str/tuple/bool可变类型: list/set/dict''''''map(映射) 将一个元素通过一种方法转换成另外一个元素- 转换函数- 待映射的数据会对列表里的每个元素, 使用转换函数进行转换, 得到一个新的列表map(st
# 定义一个列表来存储所有学生信息import sqlite3conn = sqlite3.connect('student.db')conn.execute('''create table if not exists student (sid text primary key not null,name text not null,sex text not null,phone text not null)''')# 打印功能菜单def print_menu():print('=' * 30)print('学生管理系统')print('1.添加学生信息')print('2.删除学生信息')print('3.修改学生信息')print('4.显示所有学生信息')print('0.退出系统')print('=' * 30)# 添加学生信息def add_stu_info():sid = input('请输入新学生的学号:')cursor = conn.execute("select * from student where sid=?", (sid,))if len(cursor.fetchall()) > 0:print('要添加的学生已存在')else:name = input('请输入新学生的姓名:')sex = input('请输入新学生的性别:')phone = input('请输入新学生的手机号码:')conn.execute("insert into student(sid,name,sex,phone) values (?,?,?,?)", (sid, name, sex, phone))conn.commit()# 删除学生信息def del_stu_info():sid = input('请输入要删除的学号:')cursor = conn.execute("select * from student where s
--创建表 create tablecreate table 表名 (列名1 列类型,列名2 列类型, ..., 列名n 列类型);-- 分号;用户分隔多条sql语句, 多个sql语句同时执行, 分号必不可少. 如果只执行一条sql, 分号可有可无create table student_01 (student_no text, name text, birthday text, sex text);--添加数据(插入数据)insert into 表名 (列名1,列名2,...,列名n) values (数据1,数据2,...,数据n);--sql中字符串必须只能用单引号, 不能用双引号insert into student_01 (student_no, name, birthday, sex) values ('0001','张三','2000-10-11','男');--当插入的字段是表里面所有字段时, 字段列表可以省略. 条件是数据的顺序必须和字段的顺序保持一致insert into student_01 values ('0001','张三','2000-10-11','男');insert into student_01 values ('张三','0001','2000-10-11','男');-- 使用sql建一张成绩表 score_01--查询数据select 列名1,列名2,...,列名n from 表名;select student_no,name,birthday,sex from student_01;--当我们查一张表的所有字段时, 可以用*代替字段名select * from student_01;--条件查询, 列表=列值 (比较运算符) (相等: =) <><=>=!=select * from student_01 where student_no='0001';select * from student_01 where name='张三';--sql同样支持逻辑运算符, and orselect * from student_01 where student_no='0001' and name='张三';s
import smtplibfrom email.header import Headerfrom email.mime.text import MIMEText# 发送方的账号密码sender = "lou_yj@163.com"password = "EKKGWNSQKDPAIYWN"receivers = ["super_leoning@163.com"]subject = "测试邮件"# 最简单的纯文本邮件->plain# application/json, text/plain, text/xmlmessage = MIMEText("这是一封测试邮件", "plain", "utf-8") # 邮件正文, 邮件类型, 邮件编码message["From"] = Header(sender, "utf-8") # 发件人信息message["To"] = Header(';'.join(receivers), "utf-8") # 收件人message["Subject"] = Header(subject, "utf-8") # 标题smtpObj = smtplib.SMTP("smtp.163.com", 25) # 和服务器进行连接smtpObj.login(sender, password) # 登录smtpObj.sendmail(sender, receivers, message.as_string()) # 发邮件smtpObj.quit() # 关闭print("邮件发送成功")
import timefrom selenium import webdriver# from selenium.webdriver import ActionChainsfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.common.by import Byimport pyautoguidriver = webdriver.Edge(executable_path="msedgedriver.exe")driver.get('https://www.baidu.com')time.sleep(2) # 等待页面加载完成# action_chains = ActionChains(driver)# body = driver.find_element_by_tag_name('body') # [name="body"]# print(body)## action_chains.context_click(body).perform()# time.sleep(3)## pyautogui.typewrite(['down', 'down', 'down'])# time.sleep(3)# pyautogui.typewrite(['return'])## time.sleep(10)'''<div name="body" class="body" id="ddd"></div><body></body> #tag'''# driver.find_element_by_link_text("新闻").click()# time.sleep(2)## # 切换窗口# all_windows = driver.window_handles # 窗口句柄, 列表# driver.switch_to.window(all_windows[1]) # 窗口句柄## driver.find_element_by_link_text("读懂习近平总书记二十大后首次出京活动的深意").click()# time.sleep(2)## '''# <select>#
'''find_element_by(查找单个元素的)->高版本: find_elementfind_elements_by(查找多个元素的)->高版本: find_elementsfind_element(By.TAG_NAME,'tag01')find_element_by_tag_name('tag01') -> find_element_by_css_selector('tag01')find_element(By.CLASS_NAME,'class01')find_element_by_class_name('class01') -> find_element_by_css_selector('.class01')find_element(By.ID,'id01')find_element_by_id('id01') -> find_element_by_css_selector('#id01')find_element(By.NAME,'name01')find_element_by_name('name01') -> find_element_by_css_selector('[name="name01"]')find_element_by_css_selector('[id="id01"]')find_element_by_css_selector('[class="class01"]')find_element(By.LINK_TEXT,'新闻')find_element_by_link_text('新闻') # 全部文本find_element(By.PARTIAL_LINK_TEXT,'新')find_element_by_partial_link_text('新') # 部分文件页面有两个class01的元素, 使用find_element_by得到的结果是两个中的第一个value=find_element(By.NAME,'name01').get_attribute('class
import jsonimport osimport urllib.requestimport reresponse = urllib.request.urlopen('https://image.baidu.com/search/albumsdetail?tn=albumsdetail&word=%E5%9F%8E%E5%B8%82%E5%BB%BA%E7%AD%91%E6%91%84%E5%BD%B1%E4%B8%93%E9%A2%98&fr=searchindex_album%20&album_tab=%E5%BB%BA%E7%AD%91&album_id=7&rn=30')html = response.read().decode()# print(html)# https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF'''- 目标明确: 要什么东西- 抓取网页到本地进行分析(规律)- 爬取result = re.findall('src="(.+?)"', content)print(result)'''# linkData开头, 单引号中间的字符串, linkData: ('要找的内容')result = re.findall("linkData: ('.+?')", html)image_list = json.loads(eval(result[0]))if not os.path.exists("images"):os.mkdir("images")index = 0for image_item in image_list:image_url = image_item['thumbnailUrl'].replace('\/', '/')urllib.request.urlretrieve(image_url, "images/image-" + str(index) + '.gif')index = index + 1print(image_url)# json.dumps() # python对象(list,di
网络聊天室
服务端代码
# 1. 服务器要有多个线程, 分别负责每个客户端# 2. 客户端一个线程'''功能:1. 退出当前用户聊天窗口 (:unselect)服务器阻塞点:recvfrom: 接受所有用户消息的, 当recvfrom阻塞时, 意味着所有客户端都没有消息过来客户端阻塞点:1. input等待用户输入, 阻塞时服务器推送消息就无法处理啦2. 接收服务器消息:消息类型:- 登录- 聊天- 退出- 新用户上线- 用户下线xx={"type":"chat","to_user": "user01", "message":"xxxx"}xxx['key']=value{"type":"login","user": "user01"}python: {"type": True}json: {"type": true}1. 实现用户登录功能客户端: {"type":"login","user": "user01"}服务器: 收到login消息->在线用户列表->所有用户发送用户上线消息{"type":"online","new_user":"user001","all_users":{"user01":"127.0.0.1:8888"}}'''import jsonimport socketdef encode_msg(msg):return json.dumps(msg).encode('utf-8') # dict->str->bytesdef decode_msg(msg):return json.loads(msg.decode('utf-8')) # bytes->str->dictonline_users = {}server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_socket.bind(('localhost', 8888))while True:recv_message, recv_address = server_socket.recvfrom(1024)print("
udp_server.py
import socket# 1. 初始化sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # SOCK_DGRAM指定UDP协议# 2. 绑定地址(ip+端口)host = '127.0.0.1'port = 50000s.bind((host, port))# 3. 收发数据message, address = s.recvfrom(1024)print("收到客户端消息: " + message.decode('utf-8'))s.sendto(b'hello', address)# 4. 结束交互s.close()'''cpu / 内存 / 磁盘 文件10G->内存(8G)2行-->操作系统认为后2行->操作把后2行读到cache LRU cache满了,会把最近没有使用的缓存给清掉1. 内存-> 磁盘缓存2. cpu-->寄存器-->高速缓存 -> 内存3. redis缓存系统, memcache 缓存android --> linux'''
udp_client.py
import socket# 1. 初始化sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # SOCK_DGRAM指定UDP协议# 2. 收发数据host = '127.0.0.1'port = 50000s.sendto(b'hello', (host, port))message, address = s.recvfrom(1024)print("收到服务器的消息: " + message.decode('utf-8'))# 3. 结束交互s.close()
socketserver.py
import socket# 1.初始化socket对象import timeserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# SOCK_STREAM: TCP面向连接的, 流式传输; 可靠,性能有损失.# SOCK_DGRAM: UDP,面向于非连接的, 数据报文的传输; 不可靠, 性能非常好.# www.baidu.com(ip)# 2. 选址ip = "127.0.0.1"port = 50000 # 0-65535server_socket.bind((ip, port))# 3. 监听/建商店# backlog 可以同时接受的等待连接数有多少server_socket.listen(5)# 4.接受客户端连接/开门营业# client_socket专门负责与客户端通信的socket连接(导购员)# address 客户端地址# 这个方法是阻塞的 (blocked), 直到有客户端进来才会执行后续的代码client_socket, address = server_socket.accept()# 5. 数据传输# 字符串->字节数组 1. b'' 2. encode方法,编码# 字节数组转字符串: decode 解码# ascii 0-9 a-b A-B $%^&*# gbk/gb2312 中文# 'utf-8'client_socket.send("欢迎来超市购物".encode('utf-8')) # bytes而不是字符串data = client_socket.recv(1024)print("收到来自客户端的消息:" + data.decode('utf-8'))# 6. 传输结束client_socket.close()server_socket.close()
socketclient.py
import socket# 1.初始化socket对象, 客户端必须和服务端参数保持一致client_socket = socket.socket(socket.AF_INET, socket.SOCK_STR