一、基础语句与语法结构
1.1 基本使用
python没有{}这样的符号来框定范围
所以缩进要求极为严格,在python中缩进往往被识别用来判断代码的层次关系。
1.2 输出与输入语句
1.2.1 print()函数
相对C语言,python中的基本输出函数print更为直接,使用更加自由,其主要知识点更偏向于python字符串的知识点。
值得注意的是,python中的print()函数,在基础阶段往往会被描述为“每个print都会重启一行”
很明显,如果这样,某些情况下就会出现问题,可控性大幅降低
实际上,print()中的最后位置总是有着最后一个参数n,这个参数格式固定为 end="{字符串}"
这个参数的作用是在尾端添加{字符串}的内容,而python对于这个参数默认值就是\n
python字符串中的引号
单与双
python中的两种引号某种程度上优先级基本等同,按需选用即可。
转义出引号
如果在要打印的字符串中出现了大量引号时,就可以使用转义字符:在前面加一个反斜杠’\‘
字符串连接
python的字符串可以用“ + ”进行连接(实际上也可以这样连接变量)
跨行三引号
三引号在python中会被解释器识别,其内部的内容可以出现自动换行情况(切换所见即所得模式)
python中的转义字符:
1.3.2 input()函数
input()函数可以先打印括号内的参数,并且等待用户的一条输入(以回车结尾的),并将用户输入作为返回值。
首先可以发现,python中的input()函数括号中的参数是非常少的,仅有一条字符串,不难想到,它与scanf()最大不同:无法指定返回值
也就是说,input()函数只能接收字符串,无论用户希望的是什么值,它都只会作为str型赋值
这就要用到类型转换(请自行跳转到1.3.6)
1.3 python的数据
1.3.1 字符串变量 str
用方法修改字符串的大小写
空格/数字/符号/字母/(完整)转义符/汉字 = 1个长度
函数len()可用于测量字符串长度
提取单个字符:
print("Hello"[3])
结果为l,python中的索引同C从0开始数
(所以python字符串本质上还是C语言中的字符数组)
.a 记录下python中的解包机制:
python中有一个神奇的解包机制,比如在pwn的过程中接受泄露出的地址和canary时赋值给某个变量前首先要用函数或方法进行的处理,这就是解包,正向开发过程中的话:
比如将一个字符串赋值给多个变量,这时每个变量都会自动的按顺序接收字符串的一部分,当然字符串长度和用来接收的变量个数一致,如下:
这时三个变量就被分别赋值为了ink的三个字母
1.3.1_f&w 字符串相关的python函数/方法
f.1 len()——测量字符串长度
f.2 chr()/ord()——对字符/ascii码进行互相转换
w.1 strip()家族——大范围清理
用来删去字符串两端的相关内容
内容即方法内提供的参数1
注:该方法的具体作用方式是将所有相关的字符删除
如:
这段代码中lstrip()的作用就是从最左端开始往里找字符"a"然后全删了
结果也是 babbbccc
结果是 babbb
所以说strip()的作用是删除“相关”的字符
详细理解:strip的作用是从提供的参数中提取出所有的不同要素,然后拿着这几种字符从指定方向开始找相同的字符,找到多少删多少,找到没有的字符停止。
lstrip()从左端开始 rstrip()从右端开始 strip()两边同时开始
w.2 removeprefix()&removesuffix()——精确删除
用来删去字符串两端的指定内容
同样内容是 参数1
这个方法与strip()套组的不同之处在于它的作用更精确,
该方法的作用是从两端往里找并删除与参数1完全相同的内容
如果没有找到则什么也不做
像这段因为左端并没有四个a(只有3个),则方法对字符串没有做什么更改
结果是aaababbbccc
所以这个方法多用来删去URL的前缀以及文件的拓展名后缀
比如这样:
就只会显示这个txt的文件名
w.3 format()方法——格式化字符串
置于字符串末端,用于向字符串中添加相应变量值
“占位符”中填入要访问的参数序号,参数中传入变量名
以及类似于C语言格式化字符串的一些输出控制方式:
控制浮点数输出位数
w.4 .join()——连接字符形成字符串变量
基本用法:str = " 字符 ".join( str_list )
将列表各个元素链接在一起并用字符分隔形成新的字符串(其中列表元素需要是字符类型)
w.5 .isupper()/.islower()——判断是否为大/小写
f.1 len()——测量长度
1.3.2 整形 int
python中有这样的写法:7_000_000
这样写时解释器会自动将下划线_忽略,而这些_可用来分位提高可读性,在处理大数值时有用
1.3.3 浮点型 float
关于python中浮点数的类型变化问题:
python中任意两个数相除,结果总是浮点数
在其他任何运算中,只要有操作数是浮点数,结果总是浮点数
1.3.4 布尔类型 bool
只包含两个值:
真 True
假 False
1.3.5 空值类型 NoneType
None
多用于赋初值
1.3.6
type()函数:可以返回括号内参数的数据类型
类型转换:
python中的类型转换形式上更像C语言中的强制类型转换:
C语言:
int a = 777;
float f = (float)a;
python:
S1 = input("这玩意是个字符串str不是整形int")
#键入 777
result = 777 + int(S1)
#结果是1554
python中的类型转换算是有着好多函数,函数名就是相应的数据类型,参数是各种数据类型,返回值是与参数同值不同型的值。
python中多变量赋值:
相对C语言“,”从变量名和数值后面移到了变量名中间,按照如下格式即可
a1, a2, a3 = 1, 2, 3
1.3.7 变量
python中并不存在定义层面上的“常量”,一般来说程序员会用全大写的变量名用来标注一个变量要用做常量使用(即其在全局中不应改变)。
1.4 列表
1.4.1 列表基础
.a 访问
类似于C数组
但python中的列表有个很牛逼的地方:列表的内容不必是同一类型的
即像这样实际上也是合法的
基本格式:
data_list = [ , , ]
python中列表的一次性输出:
写法:
结果:
python列表中访问倒数元素的特殊语法:
data_list[-1],即访问倒数第一个元素
以及这种写法衍生出的一些对字符串处理方式:
,当然它也等同于
索引 [ : x ] 作用是删去列表中的倒数第x个元素(字符)
.b 修改
末尾添加:
将元素追加到列表末尾
data_list.append( 参数 )
插入元素:
将元素插入到指定索引处,其余元素均会向右移动一个索引
data_list.insert( 参数1 , 参数2 )
del语句删除指定索引元素:
将指定索引位置的元素删除
del data_list[ 参数 ]
弹出指定元素:
将指定索引位置的元素“弹出”并返回它的值,可以将其赋给一个别的变量
temp = data_list.pop( 参数 ) 或者直接当成删除使用: data_list.pop( 参数 )
由值指定删除:
将值作为参数寻找位置并删除它
data_list.remove( 参数 )
.c 管理
作用于列表的顺序排序:
根据ascii码值从小到大排序列表的内容
data_list.sort( [参数] )
参数多数时候可省略,填入时可填入reverse = True,可使排列顺序反过来。
以及对运行机制的一些猜测:该方法使用时会先找到每个元素的第一个元素(比如嵌套列表或者字符串列表,然后将其按从小到大排列)
呈现为返回值的顺序排序:
与sort方法大致相同,不同的是它用来返回一个排序后的列表而不是修改列表本身。
newlist = sorted(data_list)
反向排列列表:
将列表的顺序逆反过来
data_list.reverse( )
.d 列表相关的基本方法与函数
注:列表使用方法与常规变量使用方法有一个很大的不同之处:
列表可变,而变量不可变:
列表在使用方法时往往是直接作用于列表,对列表内容进行更改
而变量在使用方法时往往相当于创建了个临时变量,将其指向方法的返回值。所以如果需要用方法改变一个变量,往往需要将其返回值赋值给这个变量。
append方法——用于向已有列表中添加元素:
使用:data_list.append("new")
remove方法——用于移除列表中的某个元素:
使用:data_list.remove("old")
要注意的是,remove方法使用时删除的元素要确实存在于该列表中,否则报错
len()函数——求元素数量
max()函数——返回列表中的最大值
min()函数——返回列表中的最小值
sorted()函数——返回一个从小到大排序的列表(嗨嗨嗨冒泡排序给爷死哈哈哈哈哈哈)
1.4.2 操作列表
1.4.3 列表切片、元组、其他
1.5 字典
1.5.1 字典基础
用来储存“ 键 值 对”
结构:
data_dictionary = {"ink":"114514",
"white":"777"}
{}框定 :对应 ,分隔
键不可变,值可变
同时,由于以上性质,列表就不能用作字典的“键”
这时如果 键 需要拥有多个元素,就要用到元组(元组不可变):data = ( 参数1 , 参数2)
在字典中直接添加键值对:
data_dictionary["robot1"] = "woce"
字典中键的是否存在:
该字段会拥有一个布尔类型的返回值
键值对的删除:
1.5.2 使用字典
1.6 python的运算符
1.4.1 数学运算符
同C(多数)
1.4.2 逻辑运算符
判断:
== !=
> <
>= <=
基本同C
逻辑:
and 与 &&
or 或 ||
not 非 !
(大致逻辑与英语相当)
基本同C:and和or可连接两个或两个以上的值,not只用来判断一个布尔式
优先级:not>and>or
二、条件语句与循环结构
2.1 条件语句
2.1.1 if...else 语句
if [条件]:
{代码段1}
else:
{代码段2}
[条件]为True则执行代码段1,为False执行代码段2。
注意:
python中没有else if这种东西,用于替换的是 elif 语段,注意区分
2.2 循环语句
2.2.1 for()结构
基本语法:
一般来讲,如果顺延C语言的思路来使用python的for结构,实际更多的时候可能会是与range()方法联动使用:
这是标准的顺延C语言思路的产物:
以及要注意这种用法中range()中的参数2并不会被轮到,所以它相当于 i<3 而不是 i<=3
range()函数实际上可以有参数3:步长
上面的“普通用法”相当于这样:即步长默认为1.
(另外实际上参数1也可以被省略,其默认值为0)
for循环小拓展:
列表推导式,相当于是小型循环语句,多用于列表
data_list = [ new_arr for s in list2 ]
语句作用大致是将其他列表中的元素进行一些列操作用于创建新列表
2.2.2 while结构
基本语法:
相对for循环,while循环可用来解决“循环次数未知的情况”,即如果循环结束与否需要根据某个函数的情况来决定,则可以利用while的条件A位置来实现。
(看教学看迷糊了属于是,给我整的还以为python没有控制语句了,实际上利用if判断加break和continue来控制循环时更好的选择)
而跳脱出C语言的枷锁,python中还有种有趣的用法:
这个基本结构中的这个“变量名”很有趣:在未系统性学习python时我在使用for循环时只当普通的迭代变量来使用,但实际上,这个变量与列表或字典结合时会拥有很强大的功能:这个临时变量在实现迭代功能的同时还可以充当“容器”的功能(这种感觉更像是C语言for循环来与数组互动时迭代变量同时充当数组索引的用法)
上代码:
可以看到,这段代码中变量"temprature" in 到列表里后,它代表的内容就开始从列表中的第一个内容往后移动。
同样字典也能这样使用,那么问题出现了:迭代变量同字典结合时获取到的是什么?键还是值?
结果:无论键内容如何,键是一般的变量还是元组,此时迭代变量获得的都是整个键。
这时tp代表的内容是可移动的三个字符串
这时tp代表的内容是可移动的三个元组
“类型显示是'tuple'元组”
更有意思的是,如果这时给迭代变量加上索引,它也可以指向对应的内容,也就是说这时迭代变量是完全等价于一个正常元组的。
然后说一下同元组结合时正确用法:
python自带的库里有几个关于字典的方法:
他们的作用都是返回字典的部分或全部:
.keys() #所有键
.values() #所有值
.items() #所有键值对
利用这几个方法就可以拆解字典并加以利用,不过多赘述。
另外python中还有种比较方便的语法逻辑:
可以同时存在两个迭代变量
其本身的用途暂且搁置,其对于字典迭代的主要意义是这两个迭代变量可以分别接受字典被拆解为元组后的键与值。
具体逻辑:for运行时tp字典被拆解为元组,这时tp_id和tp_data就会很聪明的分别赋值为这个元组的两个成员
三、函数
3.1 python自定义函数
基本语法:
def [函数名]( [参数1.2. ...] ):
... #代码段
return [返回值]
除定义语句def外与C语言大致相通
3.2 python库
3.2.1 库的调用
python中函数有着另外一个叫法——方法,可以理解为:处理问题所用的方法(其实c语言中的函数这么理解也挺好)
python中用 import 语段来包含所需要的库:
import math
math.sin(1)
引入所需库后,要使用其中的函数还需要 [库名].[函数名]({参数}) 的格式
3.3 方法
python中有一些本质与函数相同但是使用方法与函数不太一样的东西——方法
使用方法上最大不同:
函数的调用:[函数名]( 参数1 , 参数2 , ...)
方法的使用:参数.[方法名](一些参数)
(本文章仅用于记录自己学习过程)