'''
l.sort() sort不带参数, 升序排序
reverse 布尔类型: true:降序排序, false: 升序排序, 默认值是false
key 比较函数, 默认是按照数据类型比较(整数,默认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: 升序排序, 默认值是false
key 比较函数, 默认是按照数据类型比较(整数,默认int)
'''
'''
10 0
int: 10 0
str: 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 sqlite3
conn = 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 table
create 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 or
select * from student_01 where student_no='0001' and name='张三';
s
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# 发送方的账号密码
sender = "lou_yj@163.com"
password = "EKKGWNSQKDPAIYWN"
receivers = ["super_leoning@163.com"]
subject = "测试邮件"
# 最简单的纯文本邮件->plain
# application/json, text/plain, text/xml
message = 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 time
from selenium import webdriver
# from selenium.webdriver import ActionChains
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import pyautogui
driver = 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_element
find_elements_by(查找多个元素的)->高版本: find_elements
find_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 json
import os
import urllib.request
import re
response = 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 = 0
for image_item in image_list:
image_url = image_item['thumbnailUrl'].replace('\/', '/')
urllib.request.urlretrieve(image_url, "images/image-" + str(index) + '.gif')
index = index + 1
print(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 json
import socket
def encode_msg(msg):
return json.dumps(msg).encode('utf-8') # dict->str->bytes
def decode_msg(msg):
return json.loads(msg.decode('utf-8')) # bytes->str->dict
online_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. 初始化socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # SOCK_DGRAM指定UDP协议
# 2. 绑定地址(ip+端口)
host = '127.0.0.1'
port = 50000
s.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. 初始化socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # SOCK_DGRAM指定UDP协议
# 2. 收发数据
host = '127.0.0.1'
port = 50000
s.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 time
server_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-65535
server_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