0x01 理解机器码,字节码的基本概念:
1 | 低级语言: 汇编 C |
1 | 高级语言: |
0x02 了解 python 的一些常见种类:1
2
3
4C python c语言版 python 默认大家所说的python一般都是指C python
J python java版 python
iron python C#版 python
...
0x03 不同python版本号间的一些区别:1
2
3python 2.6 属于过度版本
python 2.7 也属于过度版本,2020年后将不再被支持
python 3.5 属于重大改进后的版本
0x04 不同版本间的语法区别样例1
2
3部分函数名称变更,底层执行效率提升,如下,简单的事例
print "hello python2.7" 2.x 的输出写法
print("hello python3.x") 3.x 的输出写法
0x05 python 解释器自身的工作细节:1
读取并执行文件中的python代码 -> 转换成对应的字节码 -> 再转换成机器码 -> 到cpu上执行
0x06 执行python代码的两种方式:
直接通过代码文件执行:1
2python 源代码文件通常以.py结尾的,但这并不是必须的
指定python解释器位置,指定要执行的python代码文件位置 如,c:\python36\python.exe d:\demo.py 语法没有错误的前提下,即可被成功执行
进入python解释器下执行python代码:1
2
3
4
5C:\Program Files\Python36>python.exe
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print("hello python3.6")
>>> exit()
0x07 最基础的计算机编码常识:1
2ascii码,这也是最开始的字符表示方式
只需占1个字节,即8位,2的8次方等于256,完全可以把键盘上所有的英文字母和数字,特殊字符都表示完
1 | 汉语字符集的大致发展历程 |
1 | 了解 unicode 编码 [ 万国码 ] |
1 | utf-8编码 |
0x08 不同的python版本对编码的处理:1
2python 2.x 默认使用ascii编码,如果有中文,则需要事先手工指定编码
python 3.x 默认unicode编码,所以基本无需太关注编码问题
比如,在 python 2.x 代码中使用中文就必须事先代码文件头部,指定好字符集,如下:1
-*- coding:utf-8 -*-
在python2.7中手工处理win cmd输出中文乱码1
2utf-8 到 gbk unicode[万国码]相当于中间人
先把utf-8解码成unicode,再把unicode编码成gbk,下面就是具体的代码编码和解码流程
1 | #!/usr/bin/python2.7 |
如果是在python 3.x中,win cmd是不用手工编码再解码的,在python 3.x内部就已经帮我们把编码处理好了1
2
3#!/usr/bin/python3.5
stri = 'python的创始人为吉多·范罗苏姆'
print(stri)
0x09 python 中的注释:1
2
3
4
5
6
7
8
9单行注释 # 要注释的内容
多行注释,单双引号均可,在python中单双引号作用完全相同,不存在强弱引用之别,跟其它语言稍有差别
'''
要注释内容...
'''
"""
要注释内容...
"""
python 语句结束不需要分号,代码块对应关系全部以缩进来区分,格式要求很严格,非常规整
0x10 到底什么叫声明变量:1
就是一段存在指定内存地址上的数据,根据变量名可以快速找到这段数据,仅此而已
0x11 在python中声明变量及变量命名规则须知 [和其它语言并无差别]:
变量名 必须由大小写字母,下划线,数字组成,但不能以数字开头,另外,禁止使用python各种内置关键字作为变量名,如下,1
2
3
4username = "klion"
password = "admin"
username_new = username 支持变量直接再赋给变量
del username 手动销毁变量,其实python内部也会自动回收没有指向的内存空间,又名垃圾回收机制
0x12 熟练掌握 python中的一些基本数据类型,因为python本身是纯面向对象的,所以每种数据类型对应的其实就是一个类,把某个值赋给某个变量的过程其实就相当于根据这个数据类型所对应的类创建一个对象:
1] 数字类型,关键字 int , 注意,在python3.x中对于数字型并没有长度限制,python2.x 有长度限制
熟练使用数字类型的一些常用方法:1
2
3
4
5int()
把一个字符串强制转换成一个数字,前提是要转换的这个字符串必须全部是由纯数字组成
num = int("1234")
print(type(num))
1 | int(num,base=2) |
1 | bit_length 输出指定数字所占的有效二进制位数, |
1 | __add__ 比较简单,就是将两个数相加 |
2] 字符串类型,关键字 str1
2
3
4
5定义一个字符串:
单引号 'str'
双引号 "str"
三引号 """ str """ 跟注释的区别就在于有没有变量接收,没有接收就是注释,有接收就是字符串变量
字符串连接符 ' + '
熟练使用字符串的一些常用内置方法:1
2
3len() 统计字符串或者列表[以逗号分割]长度
str_info = "Hello klIon ^_^! hEllo KittY"
print(len(str_info))
通过字符串索引 取值,切片1
2
3
4
5
6str_info = "Hello klIon ^_^! hEllo KittY"
print(str_info[0]) 取第一个字符
print(str_info[2:6]) 取第三个到第7个字符,大于等于2小于6
print(str_info[9:-1]) 取第10个到倒数第一个之间的所有字符
print(str_info[12:-2]) 取第13个到倒数第二个之间的所有字符
循环取出字符串中所有的字符及其对应的索引1
2
3
4
5
6
7
8
9str_info = "Hello klIon ^_^! hEllo KittY"
print(len(str_info))
iterm = 0
while iterm < len(str_info):
print(iterm,"=>",str_info[iterm])
iterm += 1
for iterm in str_info:
print(iterm)
1 | "分隔符".join(要拆分拼接的字符串) |
1 | split('分隔符',分割次数) |
1 | rsplit('分隔符',分割次数) |
1 | partition('指定要切割的字符') |
1 | rpartition('指定要切割的字符') 以指定的字符进行分割,从右往左开始 |
1 | splitlines([False/True])以换行符进行分割,返回一个新列表,如果加上True则保留\n,否则则不保留 |
1 | replace('要替换的内容[旧]','要替换成的内容[新]',要替换的次数[默认替换所有]) |
1 | find('字符序列',字符串索引起始位置,字符串索引结束位置) |
1 | rfind('字符序列',字符串索引起始位置,字符串索引结束位置) 和find不同的是,find默认是从左开始查找的,而rfind是从右开始查找的 |
1 | strip(指定要剔除的字符[应该是遍历循环剔除的,只要匹配到其中任意一个字符就剔掉]) |
1 | lstrip(指定要剔除的字符) |
1 | rstrip(指定要剔除的字符) |
1 | upper() 把指定字符串全部转换成大写,返回一个新的字符串 |
1 | isupper() 判断目标字符串是否全部为大写,全部为大写则返回True,否则返回False |
1 | lower() 把指定字符串全部转换为小写,返回一个新的字符串 |
1 | islower() 判断目标字符串是否全部为小写,全部为小写则返回True,否则返回False |
1 | casefold()将目标字符串全部转换成小写,会返回一个新的字符串,常用 |
1 | count('字符序列',目标字符串起始索引位置,目标字符串结束索引位置) |
1 | isdecimal() 检查目标字符串是否为十进制字符[其实就是指整数],是则返回True,反之,则返回False,实际中用的较多 |
1 | isnumeric() 检查目标字符串是否为纯数字,用法同上,是则返回True,否则返回False |
1 | isspace() 检查目标字符串是否为空格,是则返回True,否则返回False |
1 | isalpha() 目标字符串是否为纯字母,是则返回True,否则返回False |
1 | isprintable检查目标字符串中是否存在不可见字符,如tab,空格...,是则返回True,否则返回False |
1 | 用于接收的变量[pattern] = maketrans('要替换的内容','替换成的内容') 有点儿类似linux中的tee命令,需要配合translate()一起使用 |
1 | title把目标字符串转换成标题样式,返回一个新的字符串 |
1 | ljust(要填充到的长度,用来填充的字符) 字符串填充,从右边开始填充 |
1 | rjust(要填充的长度,用来填充的字符) 字符串填充,从右边开始填充 |
1 | center(要填充到的长度,"要填充的内容") |
1 | capitalize() 让整条语句首字母大写 |
1 | endswith() 判断目标字符串是否以指定字符结尾 |
1 | startswith() 判断目标字符串是否以指定字符开头 |
1 | expandtabs(32) 把tab键替换成指定个数的空格,例如,下面可以直接利用此方法输出成表格的形式 |
布尔类型,关键字 Bool [务必注意开头要大写]1
2True (真),1
False(假),0
为真的情况就不说了,只说为假的情况,如下:1
2
3
4
5None
"" 空字符串
() 空元祖
[] 空列表
{}空字典
3] 列表 list,以’[]’表示,以英文逗号对列表中的每个元素进行分割,列表中的元素可以是任意数据类型,并支持随意的增删改查及in操作,列表是有序的1
2
3li = list() 创建空列表
list_info = ['klion','25','sec@sec. org','hello ','5324213','num','pentester','kali']
list_tmp = ['num',23]
依然是通过 索引,切片取值,跟字符串用法基本是一样的,切完以后会返回一个新列表1
print(list_info[3:-1])
for循环取出列表中的所有元素1
2
3print(len(list_info))# len() 方法用来统计列表元素个数
for iterm in list_info:
print(iterm)
1 | index('目标列表中的某个元素值',起始索引位置,结束索引位置)返回某个元素在目标列表中的索引数值 |
1 | insert(指定要插入到的索引位置,'要插入的内容')往原有列表中插入新数据,会直接改变原有列表 |
1 | append(要追加的元素) 往现有的列表里面里面追加一个新的列表项,把参数的整体作为一个列表元素 |
1 | extend(另一个列表) 通常用于将两个列表合并成一个列表,例如:字符串,列表,元祖,字典 |
1 | pop(指定要删除的元素索引值)删除指定的元素,会返回被删除的这个元素的值 |
1 | remove(直接指定列表中的某个元素) 移除指定的元素,同样会直接改变原有列表 |
1 | reverse() 反转列表元素,会直接改变原有列表 |
1 | sort() 对列表中元素进行排序,默认升序 |
1 | clear() 清空列表,单单只是清空列表项,并非删除该列表 |
1 | copy() 把列表拷贝一份,属于浅拷贝 |
1 | count() 统计某个元素在列表中出现的次数 |
1 | 把列表批量替换成字符串,如果列表中只有字符串,可以''.join(list) 自动循环拼接,如下, |
1 | 列表中既有字符串又有字符串则需要自己写循环,循环强制str转换成字符串再进行拼接 |
1 | 多层嵌套取值 |
in 及 not in 操作1
2
3
4if 'klion' in list_info:
print('yeah is inter! ')
else:
print('Oh No!')
1 | if 'xlion' not in list_info: |
4] 元祖类型,关键字,tuple,用’()’表示,内部一级元素是不可修改的,也就是说对一级元素项不可以增删改查,俗称,’只读列表’,但对于元素项中的子列表是可以修改的,习惯性的在元祖最后多加个逗号,元祖也是有序的
同上,通过索引,切片取值,多层嵌套取值,常用方法,如下:1
2count(指定要统计次数的元素) 统计某个
index(指定要获取索引的元素) 获取某个元素的索引位置
1 | tuple_res = ('ok','connect',110,'status','login',110,'succeed',[1,2,3,('yeah','here','linux',[23,5,354,23],),5],) |
1 | for iterm in range(len(tuple_res)): |
5] 列表和元祖的一点区别:1
元祖和列表本质几乎是一模一样的,但元祖中的一级元素是不允许修改的而列表中的元素都是可以被随意修改的
6] 字典类型,关键字 dict,用’{key->value}’表示,里面的value可以是任意类型的数据,key可以是数字,字符串,元祖,但它只有索引,不能切片,字典是无序的,默认for循环只有key,另外,元祖,列表,字典可以相互嵌套,类似php中的’数组’1
2
3
4
5
6
7
8
9
10
11
12dict_info = {
'name':'klion',
'age' :'26',
'email':'sec@sec.org',
'phone':'12334213',
'list_info' : {
'a':12,
'b':13,
'c':14
},
'city':['bj','ne','ko','to']
}
字典是根据键取值的1
2print(dict_info['email'])
print(dict_info)
字典常用的一些内置方法:1
2
3get(指定目标字典的key) 取出字典中的某个key对应的值,如果key不存在返回None
gets = dict_info.get('age')
print(gets)
1 | pop() 删除字典中指定的值 |
1 | keys() 把目标字典中的所有键取出来放到一个新的字典中 |
1 | values()把目标字典中的所有值取出来放到一个新的字典中 |
1 | items()把目标字典中的所有键值取出来放到一个新的字典中 |
1 | clear()清空目标字典,单单只是清空并不是删除 |
1 | update()更新某个键的值 |
1 | fromkeys() 根据指定的key生成一个统一值的字典 |
7] 集合类型,关键字 set,由不同元素组成,且必须为不可变类型,即字符,数字,元祖,默认是无序的,另外,内部会自动去重
定义一个集合1
2s = {1,2,3,4,5,'klion','sec@sec.org','sec','klion','kali',4,'wow'}
p = {3,5,'sec','nuddle','backbox','fedora'}
1 | add() 向集合中添加元素 |
1 | copy() 将集合复制一份 |
1 | pop() 随机删除集合中的一个元素 |
1 | clear() 清空集合中所有的元素,并非删除集合本身 |
1 | remove() 删除集合中指定的某个元素,如果没有该元素,会报错 |
1 | discard() 删除集合中指定的元素,如果没有该元素,不会报错,常用 |
集合中常用的一些内置方法1
2
3
4s_n = set(s)
p_n = set(p)
print(s_n)
print(p_n)
1 | 交集 intersection() 或者 & 取出两个集合中的共同部分 |
1 | 并集 union() 或者 |把两个集合中的所有元素去重合并 |
1 | 差集 difference() 或者 - 取出s_n中p_n没有的元素 |
1 | 补集 symmetric_difference() 或者 ^ 把两个集合合并然后抠除共有元素,留下剩余部分 |
0x13 python 基本数据类型小结:1
2对于字符串而言,执行一个功能,都会产生一个新的字符串
对于list,tuple,dic,执行一个方法,大多都是直接更新自身
0x14 python 常用的一些运算符:1
2算数运算符[ 乘除取余优先级高于加减 ]
+(加) -(减) *(乘以) /(除) //(直接取整,并非四舍五入) %(取余) **(x**y 表示x的y次方)
1 | 注意: |
1 | 赋值运算符 |
1 | 比较运算符(只返回真假) |
1 | 逻辑运算符 [ not的优先级最高,平时自己写代码时,最好把逻辑运算都加上括号 ] |
1 | 成员运算符(专门用来寻找一个字符串是否在另一个字符串里面),返回布尔值 |
1 | 三元运算符 |
0x15 python中常用的一些辅助方法:1
2
3
4
5type() 查看某个变量的数据类型
id() 查看变量在内存中的地址
help(type(变量))
dir(变量)
input() 凡是从input中输入的内容默认都是字符串类型的,如果输入的是字符串数字则需要自己手工用int强制转换下
0x16 python 流程控制格式:
条件判断:1
2
3
4
5
6单分之判断:
if 条件:
条件成立,执行此语句
条件成立,执行此语句 [ 注意缩进必须一一对应 ]
else:
条件不成立,执行此语句
多分之:1
2
3
4
5
6
7
8if 条件一:
条件成立,执行此语句
elif 条件二:
条件成立,执行此语句
elif 条件三:
条件成立,执行此语句
else:
条件不成立,执行此语句[ pass表示什么都不做 ]
循环控制:1
2while 条件[每执行完一次回来看下条件是否还满足,如果满足就继续循环,知道不满足退出循环,务必谨记在最后给退出条件]:
要循环的语句
1 | while 条件: |
1 | break 跳出当前整个循环,且后面的代码不再执行 |
1 | continue 只跳出当前这一次的循环,继续下一次循环 |
1 | for 变量 in 条件: |
1 | range(起始值,总数,每次迭代的步长) |
1 | enumrate(可迭代的对象,起始位置[默认从0开始]) 会把这个可迭代对象的索引及索引对应的值一一遍历出来,如下,前面是索引,后面是索引对应的值 |
0x17 在python钟对字符串进行格式化输出:
第一种[百分号]:1
2
3%s 代表字符串,但它基本所有类型都能接收,用的最多,一般都用这个
%d 代表数字,也就是说它只能接受整形
%f 只能接收小数,浮点数,默认加6位的精度
1 | common_out = 'Work hard to move yourself %s, work hard to do nothing, you will succeed %d' % ('klion',100) |
第二种[format方式]:1
2
3
4
5
6:d 整数
:s 字符串
:f 浮点型
:b 二进制输出
* 代表直接传列表
** 代表直接传字典
1 | format_out = 'Work hard to move yourself {name}, work hard to do nothing, you will succeed {num}'.format(name='sec',num=123) |
后话:
当你真正熟练掌握了一门脚本语言之后,再去学另一门脚本语言,其实上手用起来是很快的,这些基础语法正常情况下半天就应该搞定了