导图社区 python基础语法
适合初学者的python语法,有各种基础命令,爬虫实战,还有实用代码。干货满满,希望对你有所帮助!
编辑于2024-03-21 18:09:39python基础语法
基本语法
基本元素
语法缩进
例
变量
命名
保留字
map(a,b) a为函数 b为元素或元素集合 作用 将a的功能作用在b的每个元素上
数据类型
供计算机理解的数据形式
字符串
整数浮点数复数
浮点数科学计数法表示
复数
列表
字典
元组
获取输入
打印输出
多重输出用逗号分隔
语义方面:句子结尾加其他字符 结构方面:使光标停留在本行末尾,不是默认的下行首
%s 占位符,用%后的变量替换
格式化
不同编程语言初心
C
C++
java
VB
python
强制可读性:缩进使人读起来容易找到所属关系 较少的底层语法元素: 不去调用内存等基础操作
库引用
引用整库 不可跨点调用
格式
实例
import sklearn 会发生如上异常
引用库中单函数或群函数
import* 群函数
两种方法比较
库自定义引用
多分支结构
子主题 1
条件判断
子主题 1
子主题 1
异常处理
通用处理
子主题 1
特殊类型处理
子主题 1
全面处理
异常执行except 正常执行else 最终执行finally
with as
结构
with expression [as variable] with-block
1.as 可省略 2.有一个句块要执行 3.with用来简化try finally代码
执行过程
所谓上下文管理协议,其实是指with后面跟的expression。这个expression一般都是一个类的实体。这个类的实体里面要包含有对__enter__和__exit__函数的定义才行
循环
原理总述 for 循环变量 in 遍历结构
子主题 1
子主题 1
计数循环 for i in range(5): 输入: 输出:循环5次,i=1,2,3,4,5 for i in range(1,5): 输出:循环4次,i=1,2,3,4 for i in range(1,5,2): 输出:循环2次,i=1,3
第一类
子主题 2
第二类
K为步长
实例展示
第一类
第二类
第三类
字符串遍历 for c in s: 字母 in 字符串
子主题 3
子主题 1
文件遍历循环 for line in fi: 每行 in 文件
子主题 4
子主题 1
无限循环while
子主题 5
意外情况continue 打断循环break
子主题 6
子主题 1
子主题 1
正常完成奖励else
子主题 7
子主题 1
子主题 1
函数
定义与作用
一般格式
计算阶乘案例
理解:IPO处理模式
调用函数
参数注意
无参数
可选参数
注意:可选参数必须放于必选参数后 可选参数即有默认值的参数
n为必选参数 m有默认值为可选参数
不确定参数
b可替换其他字母 该函数用于不确定输入有多少的情况
10!与3再相乘 10!与3 5 8 分别相乘
一个 * 表示把b里边的所有元素当参数传入 两个 * 表示把字典类型的b里边的键值对当参数传入
参数传递
输入 这个函数体能理解的信息
返回值
多个返回值之间用逗号相隔
多个返回值
1.正常输出值 2.用变量接输出值
局部/全局变量
定义
S为函数内部变量,与第一行全局变量的S不同,所以在外部调用时并未改变
规则
global保留字用法与作用
没有真实创建的局部变量
被创建过的局部变量类型
lambda函数
介绍
格式
实例
用处
函数递归
定义(自己调自己)
基本元素
链条基例
函数第一行为基例 第二行为递归链条
代码实现
正规实现
传统实现
还需使用循环语句
实现思想
计算过程
例
字符串反转
传统方式 一个一个索引出来处理
递归处理 整片索引处理
运算过程分析 假设s=“12345” 1.r(2345)+1 2.r(345)+2 3.r(45)+3 4.r(5)+4 5.r("")+5 6.最终得到 “”54321
思路分析 核心操作:把第一个搬到最后一个
斐波那契数列
什么时候使用递归?
1.运算次数与输入参数有关 2.每次操作需要用到上次操作
代码复用与模块化设计
代码复用
方式
函数 def
面向对象编程 a.b ~ turtle.penup()
意义
1.避免重复造轮子 2.增加了功能的多样性(子知识+1=指数+1,则最终值加很多)
模块化设计
松紧耦合
交流通道为 函数的输入和输出 交流通道越少,函数复用可能性越高 故应函数内部紧耦合 函数之间松耦合
数据格式化和处理
数据维度
一维数据
二维数据
一维数据操作周期
存储
空格分隔
逗号分隔
其他方式
表示
有序:列表
无序:集合
读入
写入
二维数据
列表表达
存储
CSV格式
使用规则
索引
读入
写入
遍历
常用区
数值运算与处理
数值处理函数
绝对值 商余 幂余
四舍五入 取所有数值最大最小值
求和sum(列表)
改变数值类型
子主题 1
数值基本运算
加减乘除 整数除
X本身 负值 余数 幂运算
pow(x,y) 也是幂运算
增强操作符
X+=2和X=X+2等价
集合间操作符(并差交补)
关系操作
zip(拉链函数)
介绍
示例
列表合并
name_list = ["Amo", "Paul", "Jason", "Seven"] age_list = [18, 19, 20, 21] # 输出 ==> [('Amo', 18), ('Paul', 19), ('Jason', 20), ('Seven', 21)] print(list(zip(name_list, age_list)))
合成字典
name_list = ["Amo", "Paul", "Jason", "Seven"] # 定义列表name_list score_list = [80, 96, 77, 88] # 定义成绩 my_dict = dict(zip(name_list, score_list)) # 使用dict()函数将zip对象转换为字典 print(my_dict["Amo"]) # 输出 80
矩阵旋转
x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] xyz = list(zip(x, y, z)) print(xyz) # 输出 ==> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
输出字典中值最大所对应的键
data = {"张三": 100, "李四": 20, "王五": 500, "赵六": 12} obj = zip(data.values(), data.keys()) # 输出:分数最高的学生姓名为: 王五 print(f"分数最高的学生姓名为: {max(obj)[1]}")
map
介绍
使用
del square(x): return x ** 2 map(square,[1,2,3,4,5]) # 结果如下: [1,4,9,16,25]
带lambda匿名函数
map(lambda x, y: x+y,[1,3,5,7,9],[2,4,6,8,10]) # 结果如下: [3,7,11,15,19]
map(lambdax, y : (x**y,x+y),[2,4,6],[3,2,1]) # 结果如下 [(8,5),(16,6),(6,7)]
与zip()的关系
当不传入function时,map()就等同于zip(),将多个列表相同位置的元素归并到一个元组
map(None,[2,4,6],[3,2,1]) # 结果如下 [(2,3),(4,2),(6,1)]
next
next(iter(data_iter))#iter表示变为可迭代的变量
*的使用
调用函数时示例
*的使用
**的使用
字典反,参数也反,键和参数相对应
定义函数时
*的使用
**的使用
反转布尔值
~[]
位运算
逻辑位运算符
位与&(都1为1)
十进制时
先转化为二进制 1100 & 1010 从低到高,两位都是1时,结果是1,否则为0 最后转为10进制数
位或|(都0为0)
都为0时才是0,否则为1
位异或^(不同为1)
两位不同时结果为1,否则为0
按位取反~
当前数变为二进制后,0变1,1变0
位移运算符
左移<<
表示将X左移Y位
将X转换为二进制,然后对所有位置向左偏移Y位 这里对12向左偏移3位,先转换为二进制1100,然后偏移3位
右移>>
如果X是非负数,则高位不0 如果X是负数,则高位不1
应用
用户行为标识:0表示没,1表示有 第0位表示是否点赞 第1位表示是否投一个币 第2位表示是否投两个币 第3位表示是否收藏 初始状态如左图
点一个赞变为
三连是这样
计算可以用位或运算 开始:0000 点赞:0001 结果:0001 都0为0 投俩币:0100 结果:0101 再收藏:1000 结果:1101
字符串
字符串索引切片
序号
索引切片
字符串处理函数
简单
计数 分隔 大小写
对于有逗号的字符串,split(",")可以直接替换当中逗号,使逗号不再索引到
替换 居中 添加 去标点
",".join("12345")
字符串反转
str[ : :-1]
去除头尾字符
参数chars是可选的,当chars为空,默认删除string头尾的空白符(包括\n、\r、\t、' ') 当chars不为空时,函数会被chars解成一个个的字符,然后将这些字符去掉。 它返回的是去除头尾字符(或空白符)的string副本,string本身不会发生改变。 注意:这些函数都只会删除头和尾的字符,中间的不会删除。
去头尾
string.strip([chars])
无参数时,自动去掉头尾空格和换行
有参数时挨个删除
去开头
string.lstrip([chars])
默认去掉开头的空格
去掉开头1
去结尾
string.rstrip([chars])
默认去掉结尾的换行符
去掉结尾字符g
字符串格式化
槽填充原理
format
填充对齐宽度实例
2位小数和等号填充居中对齐4位小数样例
千位精度类型实例
%s %d
输出格式控制
%s 字符串或者任意对象 %d 十进制 %i 同上 %r 同repr生成的字符串 %u 无符号数 %o 八进制 %x 十六进制或长整数 %X 十六进制 %f 浮点数 %e 浮点数 %E 浮点数 %g 指数小于-4时使用 %G 指数小于-4时使用
多个输出时
字符串操作符
子主题 1
转义符
\n 换行(到下行首) \b 光标回退一格 \r 光标回本行首 \t 制表符
\t是补全当前字符串长度到8的整数倍,最少1个最多8个空格 补多少要看你\t前字符串长度 比如当前字符串长度10,那么\t后长度是16,也就是补6个空格 如果当前字符串长度12,此时\t后长度是16,补4个空格
返回类别
常用功能
去标点符号 去单一标点:ls.replace(","," ")去掉逗号 去多个标点:for i in ",.!()": lt=ls.replace(i," ") 去掉循环体标识的标点符号
字符串数字变列表数字
for i in num.replace(",",""):#replace去逗号
n.append(eval(i))
组合数据类型
集合
定义
多元素|无序性|唯一性|不可变性
建立
a = set() 建立空集合a a = {1,2,3} 若建立空集合用a = {},则默认a为字典类型
A体现无序性 B展示了set方法化整为单的过程 C展示了集合的唯一性
操作符
集合间操作(并差交补)
关系操作
增强操作符(用于更新集合)
补:两个集合不同的所有元素
处理函数
加减元素类
S.pop() 跟新S指 删除这个返回的元素
复制判定变类型类
应用场景
包含关系比较
2.前一个集合是否比后一个大
数据去重(唯一性)
序列
定义
通用操作
在吗判定~相加~索引~索引~复制
找元素~元素计数
字符比较为序号比较
元组
定义与创建
a = 1,2,3,4 a = (1,2,3,4)
索引示例
1.索引并不改变原有数据结构,而是重新生成一个新元组来显示 2.可连续索引
要点 有序性~不能修改~逗号相隔~括号创建(可没有括号)
列表
定义
操作函数
ls.pop( ) 删除最后一个元素 ls.sort( ) 列表排序 sorted(ls) 对列表排序 ls[ : :-1]也能列表反转 ls.count(元素)返回这个元素在ls中的次数
n=a.append(6) print(n) 会返回None 因为列表操作不能接
pop(i) 和pop()对比
通用操作
在吗判定~相加~索引~索引~复制
找元素~元素计数
字符比较为序号比较
应用场景
需要有序,可变的表达
要点
有序性~可变性~[ ]创建~逗号分隔
复杂度总结
列表
函数/平均性能/最差性能
双端队列
集合
字典
字符串
字典映射
定义
特点
元素间(键值对)无序 多对一 或者一对一
创建与索引
建立字典N N={"streetAddr":"中关村南大街5号"} N=dict("streetAddr":"中关村南大街5号")
处理函数
get例
pop和del 删除例
pop 在里边则删除键值对
不再则然会给定值6
del
增加~修改~删除例
增加
值修改
删除
遍历字典的键
排序
sorted(iterable, key=None, reverse=False) iterable 任何可迭代对象,包括:列表、字典、set、字符串 key 是一个函数对象,比较的元素,取自迭代器中的一个元素 reverse 排序规则,reverse = True 降序 , reverse = False 升序(默认)
按key排序
value排序
应用场景
表达映射
映射与函数的关系
什么时候用?
无序性,唯一性,不可变性 集合{},可做数据去重 有序性,不可变 元组() 可做有序数据保护 可变 列表 [ ] 希望自定义索引序号 字典
用恰当的关系表达一组数据
有无顺序
有
元素可变吗?
不可
元组
可
列表
无
自定义序号吗?
否
集合
是
字典
数据唯一吗?
是则集合
文件处理
定义
文件
文本文件
文本文件vs二进制文件
二进制文件
文件打开关闭读取
打开文件
文件名
正常电脑用反斜杠表示路径,由于反斜杠在py中表示转义符,所以用/表示 相对路径 在一个文件目录下则这么写
打开模式
r 只读 w 覆盖写 x 创建写 a 追加写
例
白板模式 = 文本形式+只读+默认值
f = open("f.txt")
f = open("f.txt","rt") 与上边等价 r=read t=txt
文本覆盖写
f = open("f.txt","w")
文本追加写 读
f = open("f.txt","a+")
文本创建写
f = open("f.txt","x")
读取内容
读全部内容 有参数则读入前size长度
读一行 有参数则读入该行前size长度
读所有行,每行为元素
遍历全文本
read()方法
处理大文件 按数量读入,逐步处理
2即为 打开的数量 用while 进行持续处理
处理小文件 一次读入 统一处理
readlines()方法
小文件 一次读入 分行处理
大文件 逐行读入,分行处理
数据直接写入
第一种方法:写入单个元素 第二种方法:将各个元素直接拼接,然后写入文件
改变操作指针
f.seek(0) 开头 f.seek(1) 当前 f.seek(2) 结尾
fo.seek(0)的意义: 刚写入ls,指针在文本最末端准备接受新内容,此时遍历则因为指针后边没有内容输出空白
f.seek(offset,whence) #offset代表文件的指针的偏移量,单位是字节bytes #whence代表参考物,有三个取值 #0:参照文件的开沟 #1:参照当前文件指针所在位置 #2: 参照文件末尾 #ps:快速移动到文件末尾f.seek(0,2)
子主题
详解
关闭
f.close()
操作json文件
介绍
1.什么是json: (1)JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。 JSON在python中分别由list和dict组成。 (2)作用:主要用于字符串和python数据类型间进行转换。 (3)Json模块提供了四个功能:dumps、dump、loads、load json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型。 (4)优点:是可以在不同语言之间交换数据的。 缺点:json只能序列化最基本的数据类型。
函数
格式互转
import json json.dumps()
一个python数据结构转换为JSON编码的字符串
import json json.loads()
现在把它转到python里的dict类型
读取文件代码
import json with open("E:\\result.json","r",encoding="utf-8") as f: data = json.load(f) print(data)
存储
以"w"的形式打开文件,不存在即创建
#保存cls_to_count file_name = "验证集cls_to_count.json" f = open(os.path.join(data_dir,file_name),"w",encoding="utf-8") f.write(str(cls_to_count)) f.close()
存储
f = content #f为处理好的文本 ff = open("新文件名字.txt","w",encoding="UTF-8") ff.write(f) ff.close()
避免乱码
filename = "KUAKE-QIC_test_and_label.json" f2 = open(os.path.join(file_path,filename), 'w',encoding="utf-8") result_json = json.dumps(result, ensure_ascii=False)#避免乱码 f2.write(result_json) f2.close()
类/对象/面对对象
介绍

创建

运行
使用流程
起框架
运行
运行结果
问题遗留
py3.7不能运行这个版本的_init_函数,赋不了初值 那么如何定义变量呢?
树
完全二叉树
判断是否为完全二叉树 下边没有从左到右加入节点
数与数组的关系
索引关系
堆
代码过长进行换行
字符串过长换行
# 使用 \ , print(c)出来的是一行 c = "hello " \ "world"
其它
表达式换行
zip
介绍
例
子主题
子主题

爬虫
代码
from bs4 import BeautifulSoup import requests import pandas as pd
def process_one(ifo):#输入单条房源文本,输出整理后关键信息 #assert len(ifo) == 7 L = [] for i in range(len(ifo)): if i == 0:#处理几室几厅 L.append(ifo[0][0]) #几室 L.append(ifo[0][4]) #几厅 L.append(ifo[0][8]) #几卫 elif i == 1:#面积 L.append(ifo[1].strip()[:-1]) elif i == 2:#朝向 L.append(ifo[2].strip()) elif i == 3:#层数 L.append(ifo[3].strip().split("共")[0][:-1]) #层级 L.append(ifo[3].strip().split("共")[1][:-2]) #总层数 elif i == 4:#建造年份 L.append(ifo[4].strip()[:4]) elif i == 5:#地址 L.append(ifo[5].split(" ")[0]) #小区 L.append(ifo[5].split(" ")[1][:2]) #所在辖区 L.append(ifo[5].split(" ")[1]) #地址 elif i == 6:#售价和均价 L.append(ifo[6].strip().split(" ")[0]) #售价 L.append(ifo[6].strip().split(" ")[-1][:-3]) #均价 return L
def get_one_page(data,url): headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} #url = "https://beijing.anjuke.com/sale/?from=esf_list" #url = "https://beijing.anjuke.com/sale/p1/?from=esf_list" r = requests.get(url, headers = headers)#发送访问请求得到内容 html = r.content.decode('utf-8', 'ignore') my_page = BeautifulSoup(html, 'lxml') #进行解析 for tag in my_page.find_all('div', class_='property-content'): #先抓取整个二手房房地产内容信息,就是单条房源信息 ifo = [] #记录一条房源的所有关键信息 for sub_tag1 in tag.find_all('p',class_="property-content-info-text") : #print(sub_tag1.get_text()) #几室几厅几卫 面积 朝向 中高低层 建造年份 ifo.append(sub_tag1.get_text()) for sub_tag2 in tag.find_all("div",class_="property-content-info property-content-info-comm"): #print(sub_tag2.get_text()) #地址 ifo.append(sub_tag2.get_text()) for sub_tag3 in tag.find_all("div",class_="property-price"): #print(sub_tag3.get_text()) #价格和每平米均价 ifo.append(sub_tag3.get_text()) data.append(process_one(ifo)) return data
#已有185页数据 url = "https://beijing.anjuke.com/sale/p186/?from=esf_list" data = get_one_page(data,url)
x_data = pd.DataFrame(data, columns=['室', '厅', '卫', '面积',"朝向","层级","层数","建造年份","小区","区域","地址","售价(万)","均价(/m2)"]) x_data.to_csv("F:\\北京二手房房价数据集\\房价数据集.csv",encoding="gbk")
参数哪里找?
进去网页,按F12进入开发者模式 找headers,就是蓝色部分
然后输入URL慢慢爬就行
关键信息怎么找?
选中单条房源,单击右键 点检查
鼠标放上去就会提示对应的网页位置,和关键信息,据此写代码即可