python基础知识
计算机的冯诺依曼体系
python解释器
CPython 官方,C语言开发,最广泛的Python解释器
IPython 一个交互式、功能增强的CPython
PyPy Python语言写的Python解释器,JIT技术,动态编译Python代码
Jython Python的源代码编译成Java的字节码,跑在JVM上
IronPython 与Jython类似,运行在.Net平台上的解释器,Python代码被编译成.Net的字节码
stackless Python的增强版本解释器,不使用CPython的C的栈,采用微线程概念编程,并发编程
最常用的还是官方CPython
基础语法
注释
# 井号标注的文本
数字
整数int
Python3开始不再区分long、int,long被重命名为int,所以只有int类型了
进制表示:
十进制10
十六进制0x10
八进制0o10
二进制0b10
bool类型
有2个值True、False
浮点数float
1.2、3.1415、-0.12,1.46e9等价于科学计数法1.46*109
本质上使用了C语言的double类型
复数complex
1+2j或1+2J
字符串
使用 ' " 单双引号引用的字符的序列
'''和""" 单双三引号,可以跨行、可以在其中自由的使用单双引号
r前缀:在字符串前面加上r或者R前缀,表示该字符串不做特殊的处理
f前缀:3.6版本开始,新增f前缀,格式化字符串
转义序列
\\ \t \r \n \' \"
上面每一个转义字符只代表一个字符,例如 \t 显示时占了4个字符位置,但是它是一个字符
前缀r,把里面的所有字符当普通字符对待,则转义字符就不转义了。
转义:让字符不再是它当前的意义,例如\t,t就不是当前意义字符t了,而是被\转成了tab键
缩进
未使用C等语言的花括号,而是采用缩进的方式表示层次关系
约定使用4个空格缩进
续行
在行尾使用 \,注意\之后除了紧跟着换行之外不能有其他字符
如果使用各种括号,认为括号内是一个整体,其内部跨行不用 \
标识符
标识符
1. 一个名字,用来指代一个值
2. 只能是字母、下划线和数字
3. 只能以字母或下划线开头
4. 不能是python的关键字,例如def、class就不能作为标识符
5. Python是大小写敏感的标识符约定:
不允许使用中文,也不建议使用拼音
不要使用歧义单词,例如class_
在python中不要随便使用下划线开头的标识符
常量
一旦赋值就不能改变值的标识符
python中无法定义常量
字面常量
一个单独的不可变量,例如 12、"abc" 、'2341356514.03e-9'
变量
赋值后,可以改变值的标识符
标识符本质
每一个标识符对应一个具有数据结构的值,但是这个值不方便直接访问,程序员就可以通过其对应的标
识符来访问数据,标识符就是一个指代。一句话,标识符是给程序员编程使用的。
Python是动态语言、强类型语言。
False等价
False等价布尔值,相当于bool(value)
空容器
空集合set
空字典dict
空列表list
空元组tuple
空字符串
None
0
逻辑运算真值表
运算符Operator
算数运算符
+、-、*、/、//向下取整整除、%取模、**幂
注:在Python2中/和//都是整除。
位运算符
&位与、|位或、^异或、<<左移、>>右移
~按位取反,包括符号位
比较运算符
==、!=、>、>=、<、<=
链式比较: 4 > 3 > 2
比较运算符,返回一个bool值
思考:1 == '1' 吗? 1 > '1' 吗?
逻辑运算符
与and、或or、非not
逻辑运算符也是短路运算符
and 如果前面的表达式等价为False,后面就没有必要计算了,这个逻辑表达式最终一定等价为
False
1 and '2' and 0
0 and 'abc' and 1
or 如果前面的表达式等价为True,后面没有必要计算了,这个逻辑表达式最终一定等价为True
1 or False or None
特别注意,返回值。返回值不一定是bool型
把最频繁使用的,做最少计算就可以知道结果的条件放到前面,如果它能短路,将大大减少计算量
赋值运算符
a = min(3, 5)
+=、 -= 、*=、/=、%=、//= 等
x = y = z = 10
成员运算符in、not in
身份运算符
is 、is not
运算符优先级
单目运算符 > 双目运算符
算数运算符 > 位运算符 > 比较运算符 > 逻辑运算符
-3 + 2 > 5 and 'a' > 'b'
搞不清楚就使用括号。长表达式,多用括号,易懂、易读。
表达式
由数字、符号、括号、变量等的组合。有算数表达式、逻辑表达式、赋值表达式、lambda表达式等
等。
Python中,赋值即定义。Python是动态语言,只有赋值才会创建一个变量,并决定了变量的类型和
值。
如果一个变量已经定义,赋值相当于重新定义。
内建函数
print(1,2,3,sep='\n', end='***') type(1) # 返回的是类型,不是字符串 type('abc') # 返回的是类型,不是字符串 type(int) # 返回type,意思是这个int类型由type构造出来 type(str) # 返回type,也是类型 type(type) # 也是type print(isinstance(1, int)) print(isinstance(False, int)) # True
程序控制
顺序
按照先后顺序一条条执行
例如,先洗手,再吃饭,再洗碗
分支
根据不同的情况判断,条件满足执行某条件下的语句
例如,先洗手,如果饭没有做好,玩游戏;如果饭做好了,就吃饭;如果饭都没有做,叫外
卖
循环
条件满足就反复执行,不满足就不执行或不再执行
例如,先洗手,看饭好了没有,没有好,一会来看一次是否好了,一会儿来看一次,直到饭
好了,才可是吃饭。这里循环的条件是饭没有好,饭没有好,就循环的来看饭好了没有
单分支
if condition: 代码块 if 1<2: # if True: print('1 less than 2') # 代码块
condition必须是一个bool类型,这个地方有一个隐式转换bool(condition),相当于False等价
if 语句这行最后,会有一个冒号,冒号之后如果有多条语句的代码块,需要另起一行,并缩进
if、for、def、class等关键字后面都可以跟代码块
这些关键后面,如果有一条语句,也可以跟在这一行后面。例如 if 1>2: pass
多分支
if condition1: 代码块1 elif condition2: 代码块2 elif condition3: 代码块3 ...... else: 代码块 a = 5 if a<0: print('negative') elif a==0: # 相当于 a >= 0 print('zero') else: # 相当于 a > 0 print('positive')
多分支结构,只要有一个分支被执行,其他分支都不会被执行
前一个条件被测试过,下一个条件相当于隐含着这个条件
# 嵌套 a = 5 if a == 0: print('zero') else: if a > 0: print('positive') else: print('negative')
while循环
while循环多用于死循环,或者不明确知道循环次数的场景
while cond: block while True: # 死循环 pass a = 10 while a: # 条件满足则进入循环 print(a) a -= 1
上例执行结果是什么?
为什么?
会不会打印出0?要注意边界的分析
如果a=-10可以吗?如何改?回忆一下,False等价是什么?
for语句
for element in iteratable: # 可迭代对象中有元素可以迭代,进入循环体 block for i in range(0, 10): print(i)
# 计数器 for i in range(0): print(i) print('---------') for i in range(-2): print(i) print('---------') for i in range(1): print(i)
range(i),i大于0,相当于计数器。
练习
打印1到10
打印10以内的奇数
打印10以内的偶数
倒着打印10以内的奇数或偶数
# 打印偶数 for i in range(0, 10): if i % 2 == 0 : print(i) for i in range(0, 10, 2): print(i) # 打印奇数 for i in range(0, 10): if i % 2 != 0 : print(i) for i in range(1, 10, 2): print(i) # 倒着打印 for i in range(8, -1 , -2): print(i)
continue
跳过当前循环的当次循环,继续下一次循环
for i in range(0, 10): if i % 2 != 0 : continue print(i) for i in range(10): if i % 2 != 0 : continue print(i) for i in range(10): if i & 1: continue print(i)
break
结束当前循环
练习:计算1000以内的被7整除的前20个正整数(for循环)
# 计算1000以内的被7整除的前20个正整数 count = 0 for i in range(7, 1000, 7): print(i) count += 1 if count >= 20: print(count) break
总结
continue和break是循环的控制语句,只影响当前循环,包括while、for循环
如果循环嵌套, continue和break也只影响语句所在的那一层循环
continue和break 只影响循环,所以 if cond: break 不是跳出if,而是终止if外的break所在的循环
分支和循环结构可以嵌套使用,可以嵌套多层。
else子句
如果循环正常结束,else子句会被执行,即使是可迭代对象没有什么元素可迭代
for i in range(0): # 可迭代对象没有迭代 pass else: print('ok') for i in range(0,10): break else: print('ok') for i in range(0,10): continue else: print('ok')
有上例可知,一般情况下,循环正常执行,只要当前循环不是被break打断的,就可以执行else子句。
哪怕是range(0)也可以执行else子句。
三元表达式
在Python中,也有类似C语言的三目运算符构成的表达式,但python中的三元表达式不支持复杂的语句
真值表达式 if 条件表达式 else 假值表达式
三元表达式比较适合简化非常简单的if-else语句。
# 判断用户的输入的值,如果为空,输出"empty",否则输出该值 value = input('>>>') if value: print(value) else: print('empty') value = input('>>>') print(value if value else 'empty')
字符串拼接
str(1) + ',' + 'b' # 都转换成字符串拼接到一起 "{}-{}".format(1, 'a') # {}就是填的空,有2个,就使用2个值填充 # 在3.6后,可以使用插值 a = 100; b = 'abc' f'{a}-{b}' # 一定要使用f前缀,在大括号中使用变量名
动态语言的特点:赋值即定义