Python基础概念
Python程序的构成

- Python 程序由模块组成。1个模块对应 python 源文件,一般后缀名是:.py。
- 模块由语句组成。运行Python 程序时,按照模块中语句的顺字依次执行。
- 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
程序基本格式
- 空格:
- 空格在python中有缩进含义,用来决定逻辑行的缩进层次,从而来决定语句的分组。
- 语句从新行的第一列开始。
- 缩进风格统一:
- 每个缩进层次使用 单个制表符 或四个空格(IDE会自动将制表符设置成4个空格)。
- python 用缩进,而不是{}表示程序块。
- 符号都是英文符号,不是中文。区分字母大小写。
- 注释:
- 行注释 每行注释前加#号。
- 段注释 使用三个连续单引号(''')。
- 行连接符 \ ,一般程序长度是没有限制的,但是为了可读性强,通常将一行比较长的程序分为多行。我们可以使用 \ 行连接符,把它放在行结束的地方。Python 解释器会将它解释为同一行。
import turtle
t = turtle.Pen()
for x in range(360):
t.forward(x)
t.left(59) #你好世界
'''
sdds
'''
a = [12,23,34,\
45,67,34,\
455,34]
print("你好\
世界")
变量
在Python中,变量也称为:对象的引用。因为,变量存储的就是对象的地址。变量通过地址引用了“对象”。
变量位于:栈内存。
对象位于:堆内存。
- Python是动态类型语言:变量不需要显示声明类型。根据变量引用的对象,Python解释器自定确定数据类型。
- Python是强类型语言:每个对象都有数据类型,只支持该类型支持的操作。
a = 3
b = "666"
标识符
用于变量、函数、类、模块等的名称。标识符有如下特定的规则:
- 区分大小写。如:abc和ABC是不同的。
- 第一个字符必须是字母、下划线。其后的字符是:字母、数字、下划线。
- 不能使用关键字。如:if、or、while等。可以使用
help()
=>keywords
查看关键字。 - 以双下划线和结尾的名称通常有特殊含义,尽量避免这种写法。比如:
__init__
是类的构造函数。
变量的声明和赋值
变量的声明和赋值用于将一个变量绑定到一个对象上,格式如下: 变量名 = 表达式
最简单的表达式就是字面量。比如:a = 5 。运行过程中,解释器先运行右边的表达式,生成一个代表表达式运算结果的对象;然后,将这个对象地址赋值给左边的变量。
变量在使用前必须先被初始化;
可以通过 del 删除不在使用的变量;
Python不支持常量,即没有语法规则限制改变一个常量的值。只能约定常量的命名规则及在逻辑上不对常量值进行修改。
- 链式赋值
链式赋值用于同一个对象赋值给多个变量。x=y=123
相当于 x=123;y=123
- 系列解包赋值
系列数据赋值给对应相同个数的变量(个数必须保持一致) a,b,c=4,5,6
相当于 a=4;b=5;c=6
对象
Python中,一切皆对象。每个对象由:id、type、value组成;
- id用于唯一标识对象,通常对应于对象在计算机内存中的地址。使用内置函数
id(obj)
可返回对象obj的标识。 - 类型用于表示对象存储的“数据”类型。类型可以限制对象的取值范围以及可执行操作。可以使用
type(obj)
获得对象的所属类型。 - 值表示对象所存储的数据的信息。使用
print(obj)
可以直接打印出来
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。
id(a)
# 2310081872176
type(a)
# <class 'int'>
print(a)
# 3
id(b)
# 2310122192304
type(b)
# <class 'str'>
print(b)
# 666

基本内置数据类型
类型 | 描述 | 示例 |
---|---|---|
int | 整数 | 122,545,544 |
float | 小数或科学计算法 | 3.14,314e-2 |
bool | 表示真假 | True、False |
str | 由字符组成的序列 | “12”,“ssd”,“你好世界” |
数字
Python支持整数和浮点数,我们可以对数字做如下运算。
运算符 | 说明 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | 3+2 | 5 |
- | 减法 | 5-3 | 2 |
* | 乘法 | 3*5 | 15 |
/ | 浮点数除法 | 8/2 | 4.0 |
// | 整数除法 | 7/2 | 3 |
** | 幂 | 2**3 | 8 |
% | 取余 | 7%4 | 3 |
<< | 左移(相当于乘两次2) | 3<<2 | 12 |
>> | 右移(相当于除两次2) | 8>>2 | 2 |
除数为0,会产生异常
运算符 +、-、*、/、//、**、% 和赋值符可以构成“增强型赋值运算符”
示例:a += 10
等价于 a = a + 10
Python 不支持自增(++)和自减(--)
整数
Python中,除10进制,还有其他三种进制:
- 0b 或 0B,二进制 0 1
- 0o 或 0O,八进制 0 1 2 3 4 5 6 7
- 0x 或 0X,二进制 0 1 2 3 4 5 6 7 8 9 a b c d e f
整数可以有多大
int 可以存储任意大小的整数。
a = 10**100
a
# 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
可以做超大数的计算,而不会造成”整数溢出“,特别适合做科学运算。
整数的缓存:命令行中Python会对范围为[-5,256]整数对象进项缓存(对象id一样),范围外的都不缓存。文件执行的缓存范围为[-5,任意正整数]。
转换
可以使用 int()
实现类型转换:
- 浮点数,
int(9.9)
结果是9; - 布尔值 True转为1,False转为0;
- 字符串 符合整数格式则直接转换为整数,否则报错;
浮点数
转换
- 类似于 int() ,我们可以使用 float() 将其他类型转换成浮点数;
- 整数和浮点数混合运算时,表达式结果自动转型成浮点数。比如:
2+8.0
结果时10.0; - 可以使用 round(value) 进行四舍五入处理;
布尔值
True
和 False
是关键字,本质上是1和0,可以和数字相加
比较运算符
所有比较运算符返回True为真,返回False为假,这于1和0等价。
以下假设变量a为15,变量b为30:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于,比较对象值是否相等 | (a == b) 返回 False |
!= | 不等于,比较对象值是否不相等 | (a != b) 返回 True |
> | 大于,返回x是否大于y | (a > b) 返回 False |
< | 小于,返回x是否小于y | (a < b) 返回 True |
>= | 大于等于,返回x是否大于等于y | (a > b) 返回 False |
<= | 小于等于,返回x是否小于等于y | (a < b) 返回 True |
关系运算符可以连着用,比如:
3<a<9
逻辑运算符
运算符 | 格式 | 说明 |
---|---|---|
or 逻辑或 | x or y | x为true,则返回true。x为false,则返回y |
and 逻辑与 | x and y | x为true,则返回y。x为false,则返回false |
not 取反 | not x | x为true,则返回false。x为false,则返回true |
同一运算符
用于比较两个对象的引用,就是对象的id
运算符 | 描述 |
---|---|
is | 判断两个标识符是不是引用同一个对象 |
is not | 判断两个标识符是不是引用的不同对象 |
is 与 == 区别:is是比较的对象地址,==是比较的对象的值;
is 对比需要注意 缓存池机制和驻留机制(该机制会导致字面量值id一致);
运算符优先级别:位运算符和算数运算>比较运算符>赋值运算符>逻辑运算符
字符串
本质上就是字符序列。Python的字符串是不可变的,我们不能对原有字符串做任何修改。
Python3的字符默认是16位 Unicode 编码,可以使用 ord()
和 chr()
对字符串就行转换。
ord("A")
65
ord("黄")
40644
chr(65)
'A'
创建字符串
使用单引号或者双引号创建字符串。多行使用三个单引号或三个多引号。
a = "nihao"
b = 'huhu'
c = '''dsdd
sd"s"d
'a'a'''
a # 'nihao'
b # 'huhu'
c # 'dsdd\nsd"s"d\n\'a\'a'
d = ""
d # ''
转换
使用 str() 将其他类型转换成字符串;
提取
可以使用[]提取字符串
a = "0123456789"
a[4]
# '4'
字符串拼接
- 可以使用+将多个字符串拼接起来。例如:“aa” + “bb” ==> "aabb"
+两边都是字符串才会拼接,如果是数字则会加法运算,如果类型不同则会抛出异常
- 可以将多个字面字符串放在一起实现拼接。
"aa" + "bb"
# 'aabb'
"aa""bbcc"
# 'aabbcc'
字符串复制
使用*可以实现字符串复制
"abc"*3
# 'abcabcabc'
从控制台读取字符串
使用 input() 从控制台读取键盘输入内容
a = input('请输入')
>>> 请输入4545
a
# '4545'
转义字符
我们可以使用“+特殊字符”,实现某些难以用字符表示的效果。比如:换行符...
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
' | 单引号 |
" | 双引号 |
\b | 退格 |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
a = "你\n好\n么"
print(a)
# 你
# 好
# 么
字符串切片 slice 操作
切片操作可以快速的让我们提取子字符串。标准格式为:[起始偏移量 start : 终止偏移量 end : 步长 step]
常规操作
示例 | 结果 | 说明 |
---|---|---|
"abcdef"[:] | "abcdef" | 提取整个字符串 |
"abcdef"[2:] | "cdef" | 从索引start索引开始到结尾 |
"abcdef"[:2] | "ab" | 从开始到索引end-1结束 |
"abcdef"[2:4] | "cd" | 从start到end-1 |
"abcdef"[1:5:2] | "bd" | 从start提取到end-1,步长是step |
其它操作
示例 | 结果 | 说明 |
---|---|---|
"abcdefghijklmnopqrstuvwxyz"[-3:] | "xyz" | 倒数3个 |
"abcdefghijklmnopqrstuvwxyz"[-8:-3] | "stuvw" | 倒数第8个到到数第3个(包头不包尾) |
"abcdefghijklmnopqrstuvwxyz"[::-1] | "zyxwvutsrqponmlkjihgfedcba" | 步长为负,从右到左反向提取 |
字符串驻留机制
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。
Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母和数字)会启用字符串驻留机制
a = "123"
b = "123"
a is b
# True
c = "555*"
d = "555*"
c is d
# False
成员操作符
in/not in
关键字,判断某个字符(子字符串)是否存在于字符串中。
a = "abcdefg"
"b" in a # True
"def" in a # True
"eee" in a # False
"eee" not in a # True
可变字符串
在Python中,字符串属于不可变对象,不支持修改,如果需要修改固定对象其中的值,可以使用 io.StringIo 对象(array模块也可)
import io
sio = io.StringIO("你好世界,我叫龙傲天")
sio.getvalue() # '你好世界,我叫龙傲天'
id(sio) # 2363908524640
sio.seek(7)
sio.write("虎")
sio.getvalue() # '你好世界,我叫虎傲天'
id(sio) # 2363908524640
方法汇总
查找
a = "这是一个方法测试文案,这里包含了45、abcdef、还有@#¥%."
- len() - 返回字符串长度 - len(a) # 33
- startswith() - 以指定字符串开头 - a.startswith("这是") # True
- endswith() - 以指定字符串结尾 - a.endswith("%.") # True
- find() - 第一次出现指定字符串位置 - a.find("文案") # 8
- rfind() - 最后一次出现指定字符串位置 - a.rfind("文案") # 8
- count() - 指定字符串出现了几次 - a.count("文案") # 1
- isalnum() - 所有字符全是字母或数字 - a.isalnum() # False
去除首位信息
b = "sxy"
- strip() - 去除字符串首尾指定信息(默认空白符) - b.strip("") # 'sx*y'
- lstrip() - 去除字符串左侧指定信息 - b.lstrip("") # 'sxy'
- rstrip() - 去除字符串右侧指定信息 - b.rstrip("") # 'sxy'
大小写转换
c = "i love you, me Too"
- capitalize() - 首字母大写 - c.capitalize() # 'I love you, me too'
- title() - 每个单词首字母大写 - c.title() # 'I Love You, Me Too'
- upper() - 所有字母大写 - c.upper() # 'I LOVE YOU, ME TOO'
- lower() - 所有字母小写 - c.lower() # 'i love you, me too'
- swapcase() - 字母大小写转换 - c.swapcase() # 'I LOVE YOU, ME tOO'
格式排版
d = "666"
- center() - 根据排版长度和填充字符(默认空白)剧中排版 - d.center(10) # ' 666 '
- ljust() - 根据排版长度和填充字符(默认空白)左排版 - d.ljust(10, "") # '666******'
- rjust() - 根据排版长度和填充字符(默认空白)右排版
判断方法
- isalnum() - 是否为字母或数字
- isalpha() - 字符串是否只由字母(包含中文)组成
- isdigit() - 字符串是否只由数字组成(不包含小数)
- isspace() - 是否为空白符
- isupper() - 是否为大写字母
- islower() - 是否为小写字母
其它方法
- replace() - 字符串替换
- split() - 基于指定分割符将字符串分割成多个字符串(默认使用空白字符)
- join() - 将一系列字符串拼接成一个字符串(join拼接性能优于“+”)
"".join(["aa", "bb", "cc"]) # 'aabbcc'
"@".join(["aa", "bb", "cc"]) # 'aa@bb@cc'
- format() - 字符串格式化功能
# 基本使用
a = "他叫{0},今年{1}岁,{0}是个好人"
a.format("许仙", 45) # '他叫许仙,今年45岁,许仙是个好人'
b = "他叫{name},今年{age}岁,{name}是个好人"
b.format(name="张飞", age=45) # '他叫张飞,今年45岁,张飞是个好人'
# 填充和对齐 ^、<、> 分别对应居中、左对齐、右对齐,后面带宽度(:后面带填充字符,只能是一个字符,默认空格)
"{:$>8}".format("666") # '$$$$$666'
"我是{0},我喜欢还数字{1:*^8}".format("天仙",85) # '我是天仙,我喜欢还数字***85***'
# 数字格式化 浮点数-f 整数-d
"{:.2f}".format(45.656554) # '45.66' 保留小数点后两位
"{:+.9f}".format(45.656) # '+45.656000000' 带符号保留小数点后两位
"{:.0f}".format(45.656) # '46' 不带小数
"{:0>3d}".format(5) # '005' 数字补0
"{:h<3d}".format(5) # '5hh' 数字补h
"{:,}".format(100000000) # '100,000,000' 以逗号分隔数字格式
"{:.2%}".format(0.66) # '66.00%' 百分比格式
"{:.2e}".format(1000000) # '1.00e+06' 指数记法