初识Python
Python特性
- 可读性强:能快速上手学习
- 简洁:实现同样的功能,代码量可能只有其他语言的一半不到
- 高级语言:无需考虑内存问题
- 可移植性强:程序不用修改就可以在大多数平台上面运行
- 解释型语言:无需编译,直接解释源代码运行
- 面向对象:既支持面向过程编程,又支持面向对象编程
- 扩展性强:其他语言编写的算法,直接在Python中调用
- 嵌入性强:Python可以嵌入其他语言中
- 丰富的扩展库:很多复杂的功能无需自己实现直接使用即可
- 动态性:所有的对象都能动态创建
Python解释器
Python 程序的执行依赖于 Python 解释器。常用的 Python 解释器有:
- CPython
- 使用 c 语言实现的解释器,最常用的解释器。通常说的解释器指的就是它
- Jython
- 使用 java 语言实现的解释器。Jython 可以直接调用 java 类库,适合在 java 平台上开发
- IronPython
- .NET 平台上使用的解释器。可直接调用.NET 平台的类,适合.NET 平台上开发
- PyPy
- 使用 Python 语言实现的解释器
注释、缩进和行连接符
- 逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句 的分组
- 语句从新行的第一列开始
- 每个缩进层次使用单个制表符或四个空格
- Python 用缩进而不是{}表示程序块
- Python 区分大小写
- Python 中的注释只有单行注释,使用#开始知道行结束的部分
- 使用三个连续单引号当做段注释,实际上是字符串未引用
- 行连接符:\
标识符
- 用于变量、函数、类、模块等的名称
- 区分大小写
- 第一个字符必须是字母、下划线。其后的字符是:字母、数字、下划线
- 不能使用关键字
- 以双下划线开头和结尾的名称通常有特殊含义,尽量避免这种写法。比如:__init__是类的构造函数
- 命名规则
类型 | 规则 | 例子 |
---|---|---|
模块和包名 | 全小写,多个单词用下划线 | math,os,sys |
函数名 | 全小写,多个单词用下划线 | sum,run |
类名 | 首字母大写,驼峰原则,每个单词首字母大写 | Person,MyClass |
变量名 | 全小写 | a,b |
常量名(实际没有常量,只是命名是约定俗成当成常量) | 全大写,多个单词下划线分隔 | BIRTH_DATE |
关键字
help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
变量和赋值
my_var = 123
print(my_var) #123
del my_var #删除变量
#若对象没有变量引用,就会被垃圾回收器回收,清理内存
#链式赋值
x=y=123
print(x,y) #123 123
#系列解包赋值
a,b,c = 1,2,3
print(a,b,c) #1 2 3
#利用系列解包赋值交换变量的值
a,b = b,a
print(a,b) #2 1
时间
- python 中可以通过 time.time() 获得当前时刻,返回的值是以秒为单位,带微秒 (1/1000 毫秒)精度的浮点值
import time
current_second = time.time()
print(current_second) #1650372171.3810017
数据类型和运算符
整数类型
- 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
print(3) #3
print(0b101) #5
print(0o74) #60
print(0x07) #7
#int()实现类型转换
#浮点类型舍掉小数点
print(int(3.14)) #3
#布尔类型:True转为1 False转为0
print(int(True)) #1
print(int(False)) #0
#字符串类型:数字字符串直接转对应int类型,含有非数字则报错
print(int("3")) #3
#print(int("3.14")) #报错
#在python2中 int 是 32 位,可以存储从-2147483648 到 2147483647 的整数,Long 类型是 64 位,可以存储:-2^63--2^63-1 之间的数值
#在python3中 int 可以存储任意大小的整数,long 被取消
#在Python3 中可以做超大数的计算,而不会造成“整数溢出”,这也是 Python 特别适 合科学运算的特点
#10的1000次方是个整数
print(type(10**1000)) #<class 'int'>
浮点数类型
- 浮点数类型,称为 float
- 用科学计数法表示,比如:3.14,表示成:314E-2 或者 314e-2
- 这些数字在内存中也是按照科学计数法存储
print(3.14) #3.14
print(314e-2) #3.14
print(314E-2) #3.14
#float()实现类型转换
#整型添加小数点
print(float(3)) #3.0
#布尔类型:True转为1.0 False转为0.0
print(float(True)) #1.0
print(float(False)) #0.0
#字符串类型:数字字符串直接转对应float类型,含有非数值则报错
print(float("3")) #3.0
print(float("3.14")) #3.14
#print(float("你好")) #报错
#round()四舍五入,不会改变原来的值,而是返回新创建的值
a = 3.14
#默认到整
b = round(a)
print(a,b) #3.14 3
#参数可以指定四舍五入到小数点几位
print(round(3.14,1))
布尔类型
- Python2 中没有布尔值,直接用数字 0 表示 False,用数字 1 表示 True
- Python3 中,把 True 和 False 定义成了关键字,但他们的本质还是 1 和 0,甚至可以和数字相加
a = True
b = False
#bool类型加减,实际是0和1的加减
print(a,b,a+b,a+a,b+b,a-b,a-a,b-b,b-a) #True False 1 2 0 1 0 0 -1
#bool类型转换,非数值型为0的值全转为True
print(bool(1),bool(0),bool(1.0),bool(0.0)) #True False True False
print(bool(9.8),bool(-1),bool("你好")) #True True True
print(bool("0"),bool("0.0")) #True True
字符串
#字符串定界符
#单引号,字符串内单引号加\转义
a = 'hello,\'python\''
print(a) #hello,'python'
#双引号,字符串内双引号加\转义
b = "hello,\"python\"" #hello,"python"
print(b)
#三个单引号,只要字符串不是以'''结尾,字符串内其他地方出现'''加\转义
c = '''\'''hello\'''\''',\'''python'''
print(c) #'''hello'''''','''python
#若字符串以'''结尾,则结尾处的每个单引号都得加\转义
d = '''\'\'\''''
print(d) #'''
#三个双引号,与三个单引号同理
e = """\"""hello\"""\""",\"""python"""
print(e) #"""hello"""""","""python
f = """\"\"\""""
print(f) #"""
##'和"不支持多行字符串(当然可以用\n),'''和"""支持多行字符串
g = 'hello,\npython'
print(g)
'''
#结果
hello,
python
'''
h = '''hello,
python'''
print(h)
'''
#结果
hello,
python
'''
#Python3 的字符 默认就是 16 位 Unicode 编码,ASCII 码是 Unicode 编码的子集
#取unicode编码 ord()
print(ord('A')) #65
#unicode编码对应的字符 chr()
print(chr(65)) #A
#字符串长度
print(len(h)) #13
print(len('')) #0
#以指定字符串开头
a = 'abcdefghijjihgfedcba'
print(a.startswith("ab")) #True
#以指定字符串结尾
print(a.endswith("ij")) #False
#第一次出现指定字符串的位置
print(a.find('de')) #3
#最后一次出现指定字符串的位置
print(a.rfind('e')) #15
#指定字符串出现的次数
print(a.count('j')) #2
#所有字符全是字母或者数字
print(a.isalnum()) #True
#去除首尾指定字符 默认去除首尾空格
print(a.strip('a'),a.strip()) #bcdefghijjihgfedcb abcdefghijjihgfedcba
#去除首部指定字符 默认去除首部空格
print(a.lstrip('a')) #bcdefghijjihgfedcba
#去除尾部指定字符 默认去除尾部空格
print(a.rstrip('a')) #abcdefghijjihgfedcb
#大小写转换,都是产生新的字符串
#首字母大写
a = 'hello python'
print(a.capitalize()) #Hello python
#每个单词的首字母大写
print(a.title()) #Hello Python
#所有字母大写
print(a.upper()) #HELLO PYTHON
#所有字母小写
print(a.lower()) #hello python
#所有字母大小写转换
print(a.swapcase()) #HELLO PYTHON
#字符串排版
#a字符串放中间,总共20个字符,2边补*(默认是补空字符串)
print(a.center(20,'*'),a.center(20)) #****hello python**** hello python
#a字符串放左边,总共20个字符,右边补*(默认是补空字符串)
print(a.ljust(20,'*'),a.ljust(20)) #hello python******** hello python
#a字符串放右边,总共20个字符,左边补*(默认是补空字符串)
print(a.rjust(20,'*'),a.rjust(20)) #********hello python hello python
#是否由数字组成
print(a.isdigit()) #False
#是否由字母组成(含汉字)
print(a.isalpha()) #False
#是否为空白符 制表符不是空白符,只有空字符串是空白符
print(' '.isspace(),ascii(9).isspace()) #True False
#是否全大写 是否全小写
print(a.isupper(),a.islower()) #False True
#字符串拼接
#字符串直接放一起,不能是变量
a = "hello,""python"
print(a) #hello,python
#+拼接,可以是变量
b = "hello,"+"python"
print(b,a+b) #hello,python hello,pythonhello,python
#字符串复制
a = "hello"*3
print(a) #hellohellohello
#不换行打印
print(a,end=' ') #hellohellohello
print(a,end='##') #hellohellohello hellohellohello##
print() #换行 默认end='\n'
print(end='\n') #换行
#提取字符,下标从0开始,既可以正向,也可以逆向
print(a[0]) #h
print(a[1]) #e
print(a[-1]) #o
print(a[-2]) #l
#字符串替换 replace 原来的字符串不变,创建了新的替换后的字符串
#参数1:要替换的字符串
#参数2:替换后的字符串
#参数3:替换几次
b = a.replace('he','me',2) #mellomellohello
print(b)
#字符串切片slice
a = "abcdefghij"
#提取整个字符串
print(a[:]) #abcdefghij
#从2索引位开始到结尾 包头
print(a[2:]) #cdefghij
#从头开始到3索引位 不包尾
print(a[:3]) #abc
#从2索引位开始到3索引位 包头不包尾
print(a[2:3]) #c
#从2索引位开始到9索引位,步长为2
print(a[2:9:2]) #cegi
#从-3索引位到结尾
print(a[-3:]) #hij
#从-8索引位到-3索引位
print(a[-8:-3]) #cdefg
#反向提取
print(a[::-1]) #jihgfedcba
#分割 split() 合并 join()
#split()将字符串以指定字符串(默认空白)分割成列表
b = a.split(sep='ef')
print(b) #['abcd', 'ghij']
#join()将可迭代对象以指定字符串拼接成字符串
c = '*'.join(b)
print(c) #abcd*ghij
#join连接成字符串只创建一次对象,+连接字符串创建多次对象,因此尽量使用join
#测试join和+的效率
import time
a = ""
begin_time_a = time.time()
for i in range(1000000):
a += "python"
end_time_a = time.time()
b = []
begin_time_b = time.time()
for i in range(1000000):
b.append("python")
end_time_b = time.time()
print(end_time_a-begin_time_a,end_time_b-begin_time_b) #0.7706842422485352 0.05655241012573242
#字符串驻留
#在文件中,任意字符串都会启用字符串驻留机制驻留机制
a = '12_34'
b = '12_34'
print(a is b) #True
a = '12#34'
b = '12#34'
print(a is b) #True
#在交互式命令行中,对于符合标识符规则的字符串(仅包含下划线(_)、字母 和数字)会启用字符串驻留机制驻留机制
# >>> a = '12_34'
# >>> b = '12_34'
# >>> print(a is b)
# True
# >>> a = '12#34'
# >>> b = '12#34'
# >>> print(a is b)
# False
#字符串格式化 format() 索引或者参数名 占位
a = '你好,我是{0},我今年{1}岁'
print(a.format('sqlboy',25)) #你好,我是sqlboy,我今年25岁
a = '你好,我是{name},我今年{age}岁'
print(a.format(name = 'sqlboy',age = 25)) #你好,我是sqlboy,我今年25岁
#填充对齐
#^居中对齐 <左对齐 >右对齐
a = '你好,我是{0},我今年{1:*^6}岁'
#居中对齐,总共6位,不足补*(默认补空格)
print(a.format('sqlboy',25)) #你好,我是sqlboy,我今年**25**岁
a = '你好,我是{name},我今年{age:^6}岁'
print(a.format(name = 'sqlboy',age = 25)) #你好,我是sqlboy,我今年 25 岁
#数字格式化
#保留小数点后2位,四舍五入
print('{0:.2f}'.format(314.15926)) #314.16
#带符号保留小数点后2位
print('{0:+.2f}'.format(314.15926)) #+314.16
#数字补0
print('{0:0>10}'.format(1)) #0000000001
#数字补*
print('{0:*<10}'.format(1)) #1*********
#以,分隔的数字格式
print('{0:,}'.format(1000000000)) #1,000,000,000
#百分比格式
print('{0:.2%}'.format(0.38)) #38.00%
#科学计数法
print('{0:.2e}'.format(1000000000)) #1.00e+09
#从控制台读取字符串
a = input("请输入a的值:");
print(a)
'''
#结果
请输入a的值:hello,python
hello,python
'''
运算符
类型 | 运算符 | 说明 | 示例 | 结果或等价 |
---|---|---|---|---|
数值运算符 | + | 加法 | 3+2 | 5 |
拼接运算符 | + | 字符串拼接、元组、列表等合并 | “你好”+“世界” | 你好世界 |
数值运算符 | - | 减法 | 3-2 | 1 |
数值运算符 | * | 乘法 | 3*2 | 6 |
复制运算符 | * | 字符串、元组、列表等复制 | “你好”*3 | 你好你好你好 |
数值运算符 | / | 浮点数除法 | 3/2 | 1.5 |
数值运算符 | // | 整数除法 | 3/2 | 1 |
数值运算符 | % | 求余(模) | 3%2 | 1 |
数值运算符 | ** | 求幂 | 3**2 | 9 |
位运算符 | & | 按位与 | 0b101 & 0b011 | 1 |
位运算符 | | | 按位或 | 0b101 | 0b011 | 7 |
位运算符 | ~ | 按位取反 | ~ 0b101 | -6 |
位运算符 | ^ | 按位异或 | 0b101 ^ 0b011 | 6 |
位运算符 | << | 左移 | 2 << 3 | 16 |
位运算符 | >> | 右移 | 4 >> 2 | 1 |
比较运算符 | == | 等于(比较对象的值是否相等,类似java中的equals方法) | 1 == 2 | False |
比较运算符 | != | 不等于(比较对象的值是否不相等) | 1 != 2 | True |
比较运算符 | > | 大于 | 1 > 2 | False |
比较运算符 | < | 小于 | 1 < 2 | True |
比较运算符 | >= | 大于或等于 | 1 >= 2 | False |
比较运算符 | <= | 小于等于 | 1 <= 2 | True |
逻辑运算符 | or | 或 | True or False | True |
逻辑运算符 | and | 与 | True and False | False |
逻辑运算符 | not | 非 | not True | False |
同一运算符 | is | 判断2个标识符是否指向同一个对象 | a is b | True |
同一运算符 | is not | 判断2个标识符是否不是指向同一个对象 | a is not b | False |
复合复制运算符 | += | 加法赋值 | a += 3 | a = a + 3 |
复合复制运算符 | -= | 减法赋值 | a -= 3 | a = a - 3 |
复合复制运算符 | *= | 乘法赋值 | a *= 3 | a = a * 3 |
复合复制运算符 | /= | 浮点数除法赋值 | a /= 3 | a = a / 3 |
复合复制运算符 | //= | 整数除法赋值 | a //= 3 | a = a // 3 |
复合复制运算符 | %= | 求余赋值 | a %= 3 | a = a % 3 |
复合复制运算符 | **= | 取幂赋值 | a **= 3 | a = a ** 3 |
复合复制运算符 | &= | 按位与赋值 | a &= 0b011 | a = a & 0b011 |
复合复制运算符 | |= | 按位或赋值 | a |= 0b011 | a = a | 0b011 |
复合复制运算符 | ^= | 按位异或赋值 | a ^= 0b011 | a = a ^ 0b011 |
复合复制运算符 | <<= | 左移赋值 | a <<= 3 | a = a << 3 |
复合复制运算符 | >>= | 右移赋值 | a >>= 2 | a = a >> 2 |
成员运算符 | in | 元素是否存在于可迭代的对象里面 | 1 in [1,2] | True |
成员运算符 | not in | 元素是否不存在于可迭代的对象里面 | 1 not in [1,2] | False |
print(3+2,3-2,3*2,3/2,3//2,3%2,3**2) #5 1 6 1.5 1 1 9
#print(3/0) #报错,除数不能为0
#divmod()函数同时得到商和余数
print(divmod(3,2),divmod(9,3)) #(1, 1) (3, 0)
#在Pycharm或者文件中执行
a = -5
b = -5
print(a is b) #True
a = -6
b = -6
print(a is b) #True
a = 256
b = 256
print(a is b) #True
a = 257
b = 257
print(a is b) #True
#超级大的整数缓存
a = -10**30
b = -10**30
print(a is b) #True
a = -10**40
b = -10**40
print(a is b) #False
a = 10**30
b = 10**30
print(a is b) #True
a = 10**40
b = 10**40
print(a is b) #False
#在命令行执行
# >>>a = -5
# >>>b = -5
# >>>print(a is b)
# True
# >>>a = -6
# >>>b = -6
# >>>print(a is b)
# False
# >>>a = 256
# >>>b = 256
# >>>print(a is b)
# True
# >>>a = 257
# >>>b = 257
# >>>print(a is b)
# False
- 在命令行中执行时,Python 仅仅对比较小的整数对象进行缓存(范围为[-5, 256])缓存起来,而并非是所有整数对象
- 而在 Pycharm 或者保存为文件执行时,结果是不一样的,这是因为解释器做了一部分优化,缓存的范围很大,具体范围我也不知道
a = 3
b = 3
print(id(a),id(b)) #2404412555568 2404412555568
- is 比较2个对象的 id 值是否相等,是否指向同一个内存地址
- == 比较的是两个对象的内容是否相等,值是否相等
import time
a = 3
b = 3
start_time = time.time()
for i in range(100000000):
a == b
end_time = time.time()
print(end_time - start_time)
start_time = time.time()
for i in range(100000000):
a is b
end_time = time.time()
print(end_time - start_time)
c = None
print(c is None,c == None) #True True
- is 运算符比 == 效率高,在变量和 None 进行比较时,应该使用 is