Python概述
pycharm常用快捷键:
作用 | 快捷键 | 作用 | 快捷键 |
---|---|---|---|
单行注释 | Ctrl + / | 复制当前光标所在行 | Ctrl + D |
格式化代码 | Ctrl + Alt + L | 删除当前光标所在行 | Ctrl + X |
全局查找 | Ctrl + Shift + R | 返回至上次浏览的位置 | Ctrl + Alt + left/right |
快速选中代码 | Ctrl + W | 替换 | Ctrl + R |
标识符与关键字:
标识符
标识符就是一个名字,就好像每个人都有自己的名字;主要作用是作为程序中变量、函数、类、模块以及其他对象的调用名称。
Python中标识符的命名要遵守一定的命名规则:
标识符由字母、下划线和数字组成,但不能以数字开头。
标识符不能和 Python中关键字等相同。
标识符严格区分大小写,例:Corazon和corazon是不同标识符。
以下划线开头标识符往往有特殊含义。
关键字
关键字就是Pytnon内部已经定义好的具有特殊意义的标识符,开发人员不能重复定义。
Python3的关键字可以通过keyword模块的变量kwlist查看:
1 | # 打印关键字列表 |
定义变量
1 | 变量名 = 数据 |
等号表示赋值运算符,两端有空格是开发规范,可以没有。
定义变量示例:
1 | name = "Corazon" |
注释
注释是编写程序时,程序员对一个语句、程序段、函数等的解释或提示,可提高程序代码可读性;
合理的代码注释应该占源代码的1/4左右,注释内容不会被解释器执行。
1 | # 单行注释信息:以#号开头,后面留一个空格 |
python代码编写语法规范
代码语句分隔符号
Python使用分号,用于一条语句的结束标识,如果是一行结尾,可用换行来替代分号。
1 | Python使用分号,用于一条语句的结束标识,如果是一行结尾,可用换行来替代分号。 |
代码语句缩进要求
Java、C 语言采用大括号“{}”分隔代码块,而Python 采用冒号“:”和“代码缩进”和来区分代码块之间的层次;对于类、函数、流程控制语句、异常处理语句等,行尾的冒号和下一行的缩进,表示下一个代码块的开始;而缩进的结束则表示此代码块的结束。
Python 中可使用空格或者Tab键实现,但无论是手动敲空格,还是使用 Tab 键,通常情况下都是采用 4 个空格长度作为一个缩进量;
默认情况下,一个 Tab 键就是4 个空格。
1 | i = int(input("请你输入一个数字: ")) |
代码语法规范补充
Python 采用 PEP 8 作为编码规范,其中 PEP 是 Python Enhancement Proposal(Python 增强建议书)的缩写;8 代表的是 Python 代码的样式指南。
下面仅给大家列出 PEP 8 中初学者应严格遵守的一些编写规则:
不要在行尾添加分号";"
不要用分号将两条命令放在同一行;
在运算符两侧、函数参数之间以及逗号两侧,都使用空格分隔;
使用必要的空行可以增加代码的可读性,通常在顶级定义(如函数或类的定义)之间空两行,而方法定义之间空一行;
另外在用于分隔某些功能的位置也可以空一行。
python中有些特殊语句指令结尾,需要加入:
python数据类型介绍
在python开发过程中,可以将数据类型分为两个大类:
python基本数据类型:字符串 数值型(整型 布尔型) 浮点型
python复合数据类型:元组、列表、字典、集合
数据类型之数字类型介绍
整数类型
python中的整型,即int类型,Python中没有对整型数字大小限制;
1 | # 整数类型示例 |
浮点类型
在python中小数都属于浮点型(float),有两种表现形式
1 | # 小数点形式(常用),较小的小数表示 |
布尔类型
布尔型(Bool)是一种特殊数据类型,常用于判断,这种类型只有两种值,即"真"与"假"。
1 | print(4 == 2,5 > 1) |
1 | # 不光上面代码语句的结果是布尔值,单独一个数据没有进行计算也可以都有自己的布尔值,这就涉及到布尔的零值。 |
数据类型间相互转换方法
python内置了进行转换数据类型的函数,常见有int()、float(),示例如下:
1 | # int() 转成整型 |
数据类型值字符类型介绍
字符串格式
单行字符串:
1 | # 用双引号,直接输出字符串 |
多行字符串也叫文本字符串,就是三个单引号或者三个双引号圈住的内容,实际上也是字符串;
1 | s = """ |
字符串信息转义设置
有些特殊字符信息前面加\ 转义字符会有特殊的含义作用:
转义字符 | 说明 | 转义字符 | 说明 |
---|---|---|---|
\n | 换行符,将光标位置移到下一行开头 | \r | 回车符,将光标位置移到本行开头 |
\t | 水平制表符,也即 Tab 键,一般相当于四个空格 | \b | 退格(Backspace),将光标位置移到前一列 |
\任意字符 | 转义,例如' ," ,\ 等 | 行尾\ | 不换行,多行编辑一行输出 |
1 | # 01 索引取值 |
字符串内置方法
在对字符串进行操作时,还会存在一些内置的方法函数,完成对字符串信息的特殊需求处理:
方法 | 作用 | 示例 | 输出 |
---|---|---|---|
upper | 大写 | "hello".upper() | "HELLO" |
lower | 小写 | "Hello".lower() | "hello" |
startswith() | 是否以a开头 | "Corazon".startswith("a") | True |
endswith() | 是否以a结尾 | "Corazon".endswith("a") | False |
isdigit() | 是否全数字 | '123'.isdigit() | True |
isalpha() | 是否全字母 | 'Corazon123'.isalpha() | False |
isalnum() | 是否全为字母或数字 | 'Corazon123'.isalnum() | True |
strip() | 去两边空格 | " hi Corazon \n".strip() | "hi Corazon" |
join() | 多字符串连接 | "-".join(["Corazon","eric"]) | "Corazon-eric" |
split() | 分割字符串,默认空格 | "Corazon-eric".split("-") | ['Corazon', 'eric'] |
find() | 返回指定字符串索引,没有返回-1 | "world".find("w") | 0 |
index() | 返回指定字符串索引,找不到会报错 | "world".index("w") | 0 |
count() | 统计指定字符串出现次数 | "world".count("l") | 1 |
len(s) | 返回字符串长度 | len("Hello,Corazon!!!")) | 16 |
replace() | 替换old为new | 'oldold'.replace('old','new',1) ‘oldold’.replace(‘old’,‘new’) | newold newnew |
format() | 格式化方法 |
注意:index()和find()方法只能匹配首个指定字符的索引
复合数据类型
元组数据类型
元组数据类型定义:
元组的元素只能读,不能进行修改(下标不能改 元素不能改 长度不能增加 但整体可以改),通常情况下,元组用于保存无需修改的内容;元组使用小括号表示声明(定义)一个元素数据类型:
1 | (element1, element2, element3, ..., elementn) |
注意:当创建的元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,否则python解释器会将它视为字符串
1 | l = (1,2,3) |
02 元组数据序列操作:
元组数据信息调取和列表操作基本一致,支持索引和切片操作。
1 | l = ("element1", "element2", "element3", "element4", "element5", "element6") |
列表数据类型
列表会将所有元素都放在一对中括号[]里面,相邻元素之间用逗号分隔,具体表现形式:
1 | [element1, element2, element3, ..., elementn] |
注意:不同于C,java等语言中的数组,python的列表可以存放不同的任意数据类型对象。
1 | l = [123,"zkrc",True] |
1 | # 列表方式赋值变量 --列表值与变量数量要一一对应 |
列表数据信息调取
我们可以使用索引(index)访问列表中的某个元素,也可以使用切片操作访问列表中的一组元素值信息,从而得到的是一个新的子列表。
1 | 索引求值 |
列表内置方法
方法 | 作用 | 示例 | 结果 |
---|---|---|---|
append() | 向列表追加元素 | l.append(4) | l``:[1, 2, 3, 4] |
insert() | 向列表任意位置添加元素 | l.insert(0,100) | l``:[100, 1, 2, 3] |
extend(``) | 向列表合并一个列表 | l.extend([4,5,6]) | l``:[1, 2, 3, 4, 5, 6] |
pop() | 根据索引删除列表元素 | l.pop(1) | l``:[1, 3] |
remove() | 根据元素值删除列表元素 | l.remove(1) | l``:[2, 3] |
clear() | 清空列表元素 | l.clear() | l``:[] |
sort() | 排序(升序) | l.sort() | l``:[1,2,3] |
reverse() | 翻转列表 | l.reverse() | l``:[3,2,1] |
count() | 元素重复的次数2是元素 | l.count(2) | 返回值:1 |
index() | 查找元素对应索引 | l.index(2) | 返回值:1 |
1 | # 01 列表元素增加操作:append insert extend |
字典数据类型
字典是python提供的唯一内键的映射(mapping type)数据类型,python使用{ }创建字典。
由于字典中每个元素都包含键(key)和值(value)两部分,因此在创建字典时,键和值之间使用英文冒号:
分隔。相邻元素之间使用英文逗号,分隔,所有元素放在大括号 { }
中,字典的元素也叫成员,是一个键值对。
1 | dictname = {'key1':'value1', 'key2':'value2', ...} |
同一字典中的各个键必须唯一,不能重复。
字典的键值对原本是无序的,但是在python3.6版本之后,字典默认做成有序的了。
1 | d = {"01": "zhangsan", "02": "lisi", "03": "wangwu"} |
字典内置的方法
方法 | 作用 | 示例 | 结果 |
---|---|---|---|
get() | 查询字典键值,取不到返回默认值 | d.get("name",None) | "zkrc" |
setdefault() | 查询字典某键的值,取不到给字典设置键值,同时返回设置的值 | d.setdefault("age",20) | 18 |
keys() | 查询字典中所有的键 | d.keys() | ['name','age'] |
values() | 查询字典中所有的值 | d.values() | ['zkrc', 18] |
items() | 查询字典中所有的键和值 | d.items() | [('name','zkrc'),`` ('age', 18)] |
pop() | 删除字典指定的键值对 | d.pop( “age”) | {'name':'zkrc'} |
popitem() | 删除字典最后的键值对 | d.popitem() | {'name':'zkrc'} |
clear() | 清空字典 | d.clear() | {} |
update() | 更新字典 |
1 | dic = {"name": "zkrc", "age": 22, "sex": "male"} |
集合数据类型
Python 中的集合,和数学中的集合概念一样,由不同可hash的不重复的元素组成的集合。
Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔。
同一集合中,只能存储不可变的数据类型,包括整形、浮点型、字符串、元组,无法存储列表、字典、集合这些可变的数据类型,否则 Python 解释器会抛出 TypeError错误。
1 | {element1,element2,...} |
说明:由于集合中的元素是无序的,因此无法向列表那样使用下标访问元素,访问集合元素最常用的方法是使用循环结构;
集合内置方法
方法 | 作用 | 示例 | 结果 |
---|---|---|---|
add() | 向集合添加元素 | a.add(4) | {1, 2, 3, 4} |
update() | 向集合更新一个集合 | a.update({3,4,5}) | {1, 3, 4, 5} |
remove() | 删除集合中的元素 | a.remove(2) | {1, 3} |
discard() | 删除集合中的元素 | a.discard(2) | {1, 3} |
pop() | 删除集合第一个元素 | a.pop() | {2,3} |
clear() | 清空集合 | a.clear() | {} |
intersection() | 返回两个集合的交集 | a.intersection(b) | {3} |
difference() | 返回两个集合的差集 | a.difference(b) b.difference(a) | {1,2} {4,5} |
symmetric_difference() | 返回两个集合的对称差集 | a.symmetric_difference(b) | {1, 2, 4, 5} |
union() | 返回两个集合的并集 | a.union(b) | {1, 2, 3, 4, 5} |
运算符号介绍
数运算符说明
运算符 | 说明 | 实例 | 结果 |
---|---|---|---|
+ | 加 | 1+1 | 2 |
- | 减 | 1-1 | 0 |
* | 乘 | 1*3 | 3 |
/ | 除法 | 4/2 | 2 |
// | 整除 | 7 // 2 | 3 |
% | 取余,求模,即返回除法的余数 | 7 % 2 | 1 |
** | 幂运算/次方运算 | 2 ** 4 | 16 |
| | 或 | 5|3 | 7 |
& | 与 | 5&3 | 1 |
^ | 异或 | 5^3 | 6 |
Tips:事实上,a | b=(1 & b)+(a ^ b)
位运算符说明
运算符 | 说 明 | 用法举例 | 等价形式 |
---|---|---|---|
= | 赋值 | x = y | x = y |
+= | 加赋值 | x += y | x = x + y |
-= | 减赋值 | x -= y | x = x - y |
*= | 乘赋值 | x *= y | x = x * y |
/= | 除赋值 | x /= y | x = x / y |
%= | 取余数赋值 | x %= y | x = x % y |
**= | 幂赋值 | x **= y | x = x ** y |
//= | 取整数赋值 | x //= y | x = x // y |
&= | 按位与赋值 | x &= y | x = x & y |
|= | 按位或赋值 | x |= y | x = x | y |
^= | 按位异或赋值 | x ^= y | x = x ^ y |
<<= | 左移赋值 | x «= y | x = x << y, y 指左移位数 |
>>= | 右移赋值 | x »= y | x = x >> y, y 指右移位数 |
比较运算符说明
比较运算符 | 说明 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
>= | 大于等于(等价于数学中的 ≥) |
<= | 小于等于(等价于数学中的 ≤) |
!= | 不等于(等价于数学中的 ≠) |
is | 判断两个变量所引用的对象是否相同 |
is not | 判断两个变量所引用的对象是否不相同 |
逻辑运算符说明
逻辑运算符 | 含义 | 基本格式 | 说明 |
---|---|---|---|
and | 与运算 | x and y | 当x和y都为真时结果才为真。 |
or | 或运算 | x or y | 当x和y都为假时结果才是假。 |
not | 非运算 | not y | 对x的结果取相反的结果。 |
成员运算符说明
in和not in用于测试给定数据是否存在于序列(如列表、字符串)中:
in作用是,如果指定字符在字符串中,则返回True,否则返回False。not in的作用刚好相反。
编写运算符应用示例代码:
1 | x="zkrc" |
输入输出应用
输入输出函数说明
print()函数
print()函数用于打印内容或变量等输出,是python中最最用的函数。
函数语法格式:
1 | print(value1, ..., sep=' ', end='\n', file=sys.stdout,flush=False) |
函数参数信息:
序号 | 函数参数 | 解释说明 |
---|---|---|
01 | value | 打印的对象,之间用逗号分隔 |
02 | sep | 打印的两个值之间的分隔符,默认是空格 |
03 | end | 打印输出以什么结尾,默认是换行符\n |
04 | file | 输出的文件对象,默认是sys.stdout,标准输出 |
05 | flush | 表示要强制冲洗流(忽略) |
print() 函数使用以%开头的转换说明符对各种类型的数据进行格式化输出,具体请看下表:
符号 | 类型 | 示例 |
---|---|---|
%s | 字符串 | "Hello %s" % "World" |
%d | 整数 | "Age: %d" % 25 |
%f 、%F | 浮点数 | "Price: %.2f" % 99.876 → 99.88 |
%x | 十六进制整数 | "Hex: %x" % 255 → ff |
%% | 百分号本身 | "Discount: 10%%" |
代码操作示例:
1 | name = "Corazon" |
input()函数
input函数是用来接收用户输入的数据,会返回一个字符串类型的数据。如果想要得到其他类型的数据进行强制类型转化。代码操作示例:
1 | # 允许用户在终端下输入自己的账号和密码 |
格式化输出
话不多说
%
格式化(传统方法)
1 | name = "Alice" |
高级控制:
1 | # 宽度与对齐 |
str.format()
方法
Python 2.6+版本支持str.format()` 方法:
1 | print("Name: {0}, Age: {1}".format("Bob", 40)) |
核心功能:
位置参数
"{0} + {1} = {2}".format(1, 2, 3)
→1 + 2 = 3
关键字参数
"User: {username}".format(username="admin")
混合使用
"{0} {last}".format("John", last="Doe")
格式化规范(:
后定义格式):
1 | # 数字格式化 |
f-strings
Python 3.6+,推荐。在渗透测试Python脚本中经常使用f-strings
方式构建PayLoad
1 | name = "Corazon" |
高级特性:
1 | # 表达式计算 |
模板字符串(string.Template
)
string.Template
是 Python 标准库中提供的一种安全、简单的字符串替换机制,特别适合处理用户提供的模板或需要防止注入攻击的场景。
基本用法:
1 | from string import Template |
高级用法
1 | # 2.自定义分隔符(继承 Template) |
安全特性
string.Template
的主要安全优势:
不执行表达式:不会像 f-strings 那样执行任意代码
无格式化功能:不能访问对象属性或执行方法
简单替换:只进行直接的字符串替换
1 | # 安全示例 - 防止注入攻击 |
实际应用场景
邮件模板
1 | email_template = Template(""" |
2. 配置文件模板
1 | config_template = Template(""" |
3. 多语言支持
1 | templates = { |
其他方法
(1) 字符串拼接
1 | print("Name: " + name + ", Age: " + str(age)) |
(2) str.join()
处理列表
1 | words = ["Python", "is", "powerful"] |
总结对比
方法 | 易读性 | 灵活性 | 安全性 | 版本要求 |
---|---|---|---|---|
% 格式化 | 低 | 中 | 低 | 所有版本 |
str.format() | 高 | 高 | 中 | Python 2.6+ |
f-strings | 极高 | 极高 | 中 | Python 3.6+ |
string.Template | 中 | 低 | 高 | 所有版本 |
流程控制语句
python流程控制语句介绍
软件程序是由语句构成,而流程控制语句是用来控制程序中每条语句执行顺序的语句;可以通过控制语句实现更丰富的逻辑以及更强大的功能;几乎所有编程语言都有流程控制语句,功能也都基本相似,其流程控制方式有:
顺序结构
分支结构
循环结构
最简单最常用的就是顺序结构,即语句从上至下逐一执行:
1 | print("I am zkrc.") |
流程控制分支语句
1 | # 单分支语句语法结构: |
双分支语句中的pass用法:
空语句,不做任何事务处理,一般用作占位
保证格式完整
保证语义完整
一些高阶用法:
1 | #01 打印num1和num2中较大的数 |
流程控制循环语句
Python语言中的循环语句支持 while循环(条件循环)和for循环(遍历循环)
流程控制循环语句-while
循环语句语法格式:
1 | while 表达式: |
1 | # 无限循环 |
流程控制循环语句-for
循环语句语法格式:
1 | for 迭代变量 in 字符串|列表|元组|字典|集合: |
1 | for i in "zkrc": |
流程控制循环嵌套
1 | #01 独立嵌套 |
循环控制语句说明
如果在某一时刻(在不满足结束条件的情况下)想提前结束循环,可以使用break或continue关键字;
循环控制语句-break
当break关键字用于for循环时,会终止循环而执行整个循环语句后面的代码信息;break 退出的是循环 exit() 或者quit() 退出的是脚本
1 | for i in range(1,6): |
循环控制语句-continue
不同于break退出整个循环,continue指的退出当次循环,但会继续在循环结构中,完成后续的循环操作;
1 | for i in range(1,6): |
循环控制语句练习-01:猜水果价格小游戏
一个水果摊,老板卖水果,你去猜水果价格,当你说出价格后,老板会告诉你大小;
如果猜高了,就会告诉你猜高了;
如果猜低了,就告诉你你猜低了;
直到猜对为止,并在猜对后,会输出一共猜了几次。
1 | import random |
编程函数
函数定义语法格式:
1 | def 函数名(var1,var2...varn): |
本文参考: