简介
python是结合了解释性、编译性、互动性和面向对象的脚本语言;特点是易于学习、易于阅读、易于维护、广泛的标准库、互动模式、可移植、可拓展、数据库、GUI编程、可嵌入;应用领域:数据分析挖掘、机器学习与深度学习、网络开发、爬虫。
变量、运算符与数据类型
注释
单行注释: #,用于注释一行
#注释内容
print("hello")
#print("world")
多行注释: ‘’’ ‘’’ 或者 “”" “”",用于注释多行
'''
注释内容1
注释内容2
'''
"""
注释内容1
注释内容2
"""
位运算
算术运算符:
示例:
# 加法:+
print(1 + 1)
# 减法: -
print(2 - 1)
# 乘法: *
print(1 * 1)
# 除法:/
print(2 / 1)
# 整除://
print(3 // 4)
# 取余:%
print(3 % 2)
# 幂:**
print(2 ** 3)
2
1
1
2.0
0
1
8
比较远算符:
# 大于:>
print(1 > 2)
# 小于:<
print(1 < 2)
# 等于:==
print(1 == 1)
# 大于等于:>=
print(1 >= 2)
# 小于等于:==
print(1 <= 2)
# 不等于:!=
print((1 != 2))
False
True
True
False
True
True
逻辑运算符:and :同时满足左右两边的条件;or:只需满足一个条件即可
#与:and
print(1 > 2 and 2 > 3)
print(1 < 2 and 2 > 3)
#或:or
print(1 < 2 or 2 > 3)
print(1 < 2 or 2 < 3)、
#非:not
print(not 1 > 2)
False
False
True
True
True
位运算:
# 按位取反:~
print(~4)
# 按位与:&
print(4 & 5)
# 按位或:|
print(4 | 5)
# 按位异或:^
print(4 ^ 5)
# 左移:<<
print(4 << 2)
# 右移:>>
print(8 >> 2)
-5
4
5
1
16
2
其他运算符:
# 是:is
print('hello' is 'hello')
# 不是:is not
print(3 is not 5)
# 在:in
arr = [1, 2, 3, 4,]
print(2 in arr)
# 不在:not in
arr = [1, 2, 3, 4,]
print(6 not in arr)
True
True
True
True
变量与赋值
person = "人类"
print(person)
one = 1
tow = 2
three = one + tow
print(three)
print(one + tow)
oneStr = "不负韶华"
towStr = "好好学习"
print(oneStr + towStr)
人类
3
3
不负韶华好好学习
数据类型与转化
# 整型:int
a = 1024
print(a, type(a))
# 浮点型:float
a = 1024.00
print(a, type(a))
# 布尔型:bool
print(type(True))
# 字符串型:
print(type("hello"))
1024 <class 'int'>
1024.0 <class 'float'>
<class 'bool'>
<class 'str'>
print()函数
# 没有参数时,每次输出后都会换行。
str = ["hello", "world"]
for i in str:
print(i)
# 每次输出结束都用 end 设置的参数 & 结尾,并没有默认换行。
str = ["hello", "world"]
for i in str:
print(i, end="&")
# i 值与 'another string' 两个值之间用 sep 设置的参数 & 分割。由于 end 参数没有设置,因此默认是
# 输出解释后换行,即 end 参数的默认值为 \n 。
str = ["hello", "world"]
for i in str:
print(i, 'another string', sep='&')
hello
world
hello&world&hello&another string
world&another string
位运算
原码、反码、补码
计算机内部使用补码表示。
原码:二进制表示
00 00 00 11 -> 3
10 00 00 11 -> -3
反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。
00 00 00 11 -> 3
11 11 11 00 -> -3 1
补码:正数的补码就是原码,负数的补码是反码+1。
00 00 00 11 -> 3
11 11 11 01 -> -3
符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算
按位非操作
~ 把 num 的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 ~ 运算中同样会取反。
~ 1 = 0
~ 0 = 1
按位与操作
只有两个对应位都为 1 时才为 1
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
按位或操作
只要两个对应位中有一个 1 时就为 1
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
按位异或操作
只有两个对应位不同时才为 1
异或操作的性质:满足交换律和结合律
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
A^B: 00 00 10 11
B^A: 00 00 10 11
按位左移操作
num << i 将 num 的二进制表示向左移动 i 位所得的值。
print(11 << 3)
00 00 10 11 -> 11
01 01 10 00 -> 88
88
按位右移操作
num >> i 将 num 的二进制表示向右移动 i 位所得的值。
print(11 >> 2)
00 00 10 11 -> 11
00 00 00 10 -> 2
2
利用位运算实现快速运算\
通过 << , >> 快速计算2的倍数问题。
# n << 1: 计算 n*2
print(2 << 1)
# n >> 1: 计算 n/2,负奇数的运算不可用
print(4 >> 1)
# n << m: 计算 n*(2^m),即乘以 2 的 m 次方
print(2 << 3)
# n >> m: 计算 n/(2^m),即除以 2 的 m 次方
print(18 >> 3)
# 1 << n: 2^n
print(1 << 4)
4
2
16
2
16
通过 ^ 快速交换两个整数。
a = 1
b = 2
a ^= b
b ^= a
a ^= b
print(a)
print(b)
2
1
通过 a & (-a) 快速获取 a 的最后为 1 位置的整数。
'''
00 00 01 01 -> 5
&
11 11 10 11 -> -5
00 00 00 01 -> 1
'''
print(5 & -5)
1
利用位运算实现整数集合
元素与集合的操作:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 从集合中删除
a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
集合之间的操作:
a 补 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
条件语句
if语句
if expression:
expr_true_suite
- if 语句的 expr_true_suite 代码块只有当条件表达式 expression 结果为真时才执行,否则将继续执行紧跟在该
代码块后面的语句。
- 单个 if 语句中的 expression 条件表达式可以通过布尔操作符 and , or 和 not 实现多重条件判断。
if 2 > 1:
print("hello")
if 2 > 1 and 2 < 3:
print("world")
if 2 > 1 or 2 > 3:
print("hello")
if 2 > 1 and not 2 > 3:
print("world")
hello
world
hello
world
if-else语句
Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。
if 语句支持嵌套,即在一个 if 语句中嵌入另一个 if 语句,从而构成不同层次的选择结构。Python 使用缩进而不是大括
号来标记代码块边界,因此要特别注意 else 的悬挂问题。
if 2 > 1:
print("yes")
else:
print("no")
#############
if 2 > 1:
if 2 > 3:
print("2大于1, 并且大于3")
else:
print("2大于1,但是不大于3")
else:
print("2不大于1")
###########
if 2 > 1:
if 2 > 0:
print("2大于1, 并且大于0")
else:
print("2不大于1")
############
if 2 > 1:
print("2大于1")
else:
if 2 > 3:
print("2大于1, 并且大于3")
else:
print("2大于1,但是不大于3")
yes
2大于1,但是不大于3
2大于1, 并且大于0
2大于1
if-elif-else语句
if expression1:
expr1_true_suite
elif expression2:
expr2_true_suite
elif expressionN:
exprN_true_suite
else:
expr_false_suite
elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。
temp = input('请输入成绩:')
source = int(temp)
if 100 >= source >= 90:
print('A')
elif 90 > source >= 80:
print('B')
elif 80 > source >= 60:
print('C')
elif 60 > source >= 0:
print('D')
else:
print('输入错误!')
请输入成绩:93
A
assert关键字
assert 这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛
出 AssertionError 的异常。
list = ['subgroup']
list.pop(0)
assert len(list) > 0
#程序抛出异常AssertionError
在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
a = 10
assert a > 11
#程序抛出异常AssertionError
循环语句
while循环
while 语句最基本的形式包括一个位于顶部的布尔表达式,一个或多个属于 while 代码块的缩进语句。
while 布尔表达式:
代码块
while 循环的代码块会一直循环执行,直到布尔表达式的值为布尔假。
如果布尔表达式不带有 <、>、==、!=、in、not in 等运算符,仅仅给出数值之类的条件,也是可以的。当 while 后写
入一个非零整数时,视为真值,执行循环体;写入 0 时,视为假值,不执行循环体。也可以写入 str、list 或任何序
列,长度非零则视为真值,执行循环体;否则视为假值,不执行循环体。
import random
guess = random.randint(0, 10)
i = 1
while True:
print("第%d次猜" % (i))
x = int(input())
if guess == x:
print("猜对了,目标数字是:", guess)
break
elif guess > x:
print("小了")
elif guess < x:
print("大了")
第1次猜
5
大了
第1次猜
3
大了
第1次猜
2
猜对了,目标数字是: 2
while-else循环
while 布尔表达式:
代码块
else:
代码块
当 while 循环正常执行完的情况下,执行 else 输出,如果 while 循环中执行了跳出循环的语句,比如 break ,将不执
行 else 代码块的内容。
count = 0
while count < 5:
print("%d < 5" % count)
count = count + 1
else:
print("%d == 5" % count)
0 < 5
1 < 5
2 < 5
3 < 5
4 < 5
5 == 5
count = 0
while count < 5:
print("%d < 5" % count)
count = count + 1
break
else:
print("%d == 5" % count)
0 < 5
for循环
for 循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如 str、list、tuple 等,也
可以遍历任何可迭代对象,如 dict
for 迭代变量 in 可迭代对象:
代码块
每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。
for i in 'hello world':
print(i, end=' ')
h e l l o w o r l d
member = ['张三', '李四', '刘德华', '刘六', '周润发']
for each in member:
print(each)
张三
李四
刘德华
刘六
周润发
member = ['张三', '李四', '刘德华', '刘六', '周润发']
for i in range(len(member)):
print(member[i])
张三
李四
刘德华
刘六
周润发
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key, value in dic.items():
print(key, value, sep=':', end=' ')
a:1 b:2 c:3 d:4
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
for key in dic.keys():
print(key, end=' ')
a b c d
for-else循环
for 迭代变量 in 可迭代对象:
代码块
else:
代码块
当 for 循环正常执行完的情况下,执行 else 输出,如果 for 循环中执行了跳出循环的语句,比如 break ,将不执
行 else 代码块的内容,与 while - else 语句一样。
for num in range(10, 20): # 迭代 10 到 20 之间的数字
for i in range(2, num): # 根据因子迭代
if num % i == 0: # 确定第一个因子
j = num / i # 计算第二个因子
print('%d 等于 %d * %d' % (num, i, j))
break # 跳出当前循环
else: # 循环的 else 部分
print(num, '是一个质数')
10 等于 2 * 5
11 是一个质数
12 等于 2 * 6
13 是一个质数
14 等于 2 * 7
15 等于 3 * 5
16 等于 2 * 8
17 是一个质数
18 等于 2 * 9
19 是一个质数
range()函数
range([start,] stop[, step=1])
1. 这个BIF(Built-in functions)有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。
2. step=1 表示第三个参数的默认值是1。
3. range 这个BIF的作用是生成一个从 start 参数的值开始到 stop 参数的值结束的数字序列,该序列包含 start 的
值但不包含 stop 的值。
for i in range(2, 6):
print(i)
2
3
4
5
for i in range(1, 10, 2):
print(i)
1
3
5
7
9
enumerate()函数
enumerate(sequence, [start=0])
1. sequence -- 一个序列、迭代器或其他支持迭代对象。
2. start -- 下标起始位置。
3. 返回 enumerate(枚举) 对象
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons, start=1)) # 下标从 1 开始
print(lst)
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
enumerate() 与 for 循环的结合使用
for i, a in enumerate(A)
do something with a
用 enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用
enumerate(A, j) 还可以确定索引起始值为 j 。
languages = ['Python', 'R', 'Matlab', 'C++']
for language in languages:
print('I love', language)
print('Done!')
I love Python
I love R
I love Matlab
I love C++
Done!
languages = ['Python', 'R', 'Matlab', 'C++']
for i, language in enumerate(languages, 2):
print(i, 'I love', language)
print('Done!')
2 I love Python
3 I love R
4 I love Matlab
5 I love C++
Done!
break语句
break 语句可以跳出当前所在层的循环。
import random
secret = random.randint(1, 10) #[1,10]之间的随机数
while True:
temp = input("不妨猜一下小哥哥现在心里想的是那个数字:")
guess = int(temp)
if guess > secret:
print("大了,大了")
else:
if guess == secret:
print("你是小哥哥心里的蛔虫吗?")
print("哼,猜对也没有奖励!")
break
else:
print("小了,小了")
print("游戏结束,不玩儿啦!")
不妨猜一下小哥哥现在心里想的是那个数字:5
大了,大了
不妨猜一下小哥哥现在心里想的是那个数字:3
你是小哥哥心里的蛔虫吗?
哼,猜对也没有奖励!
游戏结束,不玩儿啦!
continue语句
continue 终止本轮循环并开始下一轮循环。
for i in range(10):
if i % 2 != 0:
print(i)
continue
i += 2
print(i)
2
1
4
3
6
5
8
7
10
9
pass语句
pass 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就
是用来解决这些问题的。
def a_func():
pass
pass 是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管 pass 语句不做任何操
作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个 pass 语句,让代码可以正常运行。
推导式
[ expr for value in collection [if condition] ]
x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x]
print(y)
[-8, -4, 0, 4, 8]
x = [i ** 2 for i in range(1, 10)]
print(x)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
#元组推导式
a = (x for x in range(10))
print(a)
print(tuple(a))
<generator object <genexpr> at 0x000002A94DF10740>
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# 字典推导式
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
{0: True, 3: False, 6: True, 9: False}
# 集合推导式
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
{1, 2, 3, 4, 5, 6}
综合实例
passwdList = ['123', '345', '890']
valid = False
count = 3
while count > 0:
password = input('enter password:')
for item in passwdList:
if password == item:
valid = True
break
if not valid:
print('invalid input')
count -= 1
continue
else:
break
异常处理
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理
程序将被启动,从而恢复程序的正常运行。
python标准异常总结
1. BaseException:所有异常的 基类 2. Exception:常规异常的 基类 3. StandardError:所有的内建标准异常的基类
4. ArithmeticError:所有数值计算异常的基类
5. FloatingPointError:浮点计算异常
6. OverflowError:数值运算超出最大限制
7. ZeroDivisionError:除数为零
8. AssertionError:断言语句(assert)失败
9. AttributeError:尝试访问未知的对象属性
10. EOFError:没有内建输入,到达EOF标记
11. EnvironmentError:操作系统异常的基类
12. IOError:输入/输出操作失败
13. OSError:操作系统产生的异常(例如打开一个不存在的文件)
14. WindowsError:系统调用失败
15. ImportError:导入模块失败的时候
16. KeyboardInterrupt:用户中断执行
17. LookupError:无效数据查询的基类
18. IndexError:索引超出序列的范围
19. KeyError:字典中查找一个不存在的关键字
20. MemoryError:内存溢出(可通过删除对象释放内存)
21. NameError:尝试访问一个不存在的变量
22. UnboundLocalError:访问未初始化的本地变量
23. ReferenceError:弱引用试图访问已经垃圾回收了的对象
24. RuntimeError:一般的运行时异常
25. NotImplementedError:尚未实现的方法
26. SyntaxError:语法错误导致的异常
27. IndentationError:缩进错误导致的异常
28. TabError:Tab和空格混用
29. SystemError:一般的解释器系统异常
30. TypeError:不同类型间的无效操作
31. ValueError:传入无效的参数
32. UnicodeError:Unicode相关的异常
33. UnicodeDecodeError:Unicode解码时的异常
34. UnicodeEncodeError:Unicode编码错误导致的异常
35. UnicodeTranslateError:Unicode转换错误导致的异常
python标准警告总结
1. Warning:警告的基类
2. DeprecationWarning:关于被弃用的特征的警告
3. FutureWarning:关于构造将来语义会有改变的警告
4. UserWarning:用户代码生成的警告
5. PendingDeprecationWarning:关于特性将会被废弃的警告
6. RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
7. SyntaxWarning:可疑语法的警告
8. ImportWarning:用于在导入模块过程中触发的警告
9. UnicodeWarning:与Unicode相关的警告
10. BytesWarning:与字节或字节码相关的警告
11. ResourceWarning:与资源使用相关的警告
try-except语句
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
try 语句按照如下方式工作:
- 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)
- 如果没有异常发生,忽略 except 子句, try 子句执行后结束。
- 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的
名称相符,那么对应的 except 子句将被执行。最后执行 try 语句之后的代码。 - 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError:
print('打开文件出错')
打开文件出错
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError as error:
print('打开文件出错\n原因是:' + str(error))
打开文件出错
原因是:[Errno 2] No such file or directory: 'test.txt'
一个 try 语句可能包含多个 except 子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
try:
int("abc")
s = 1 + '1'
f = open('test.txt')
print(f.read())
f.close()
except OSError as error:
print('打开文件出错\n原因是:' + str(error))
except TypeError as error:
print('类型出错\n原因是:' + str(error))
except ValueError as error:
print('数值出错\n原因是:' + str(error))
数值出错
原因是:invalid literal for int() with base 10: 'abc'
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except LookupError:
print('查询错误')
except KeyError:
print('键错误')
else:
print(x)
查询错误
try-except-else 语句尝试查询不在 dict 中的键值对,从而引发了异常。这一异常准确地说应属于 KeyError ,但由
于 KeyError 是 LookupError 的子类,且将 LookupError 置于 KeyError 之前,因此程序优先执行该 except 代码块。
所以,使用多个 except 代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
dict1 = {'a': 1, 'b': 2, 'v': 22}
try:
x = dict1['y']
except KeyError:
print('键错误')
except LookupError:
print('查询错误')
else:
print(x)
键错误
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
try:
s = 1 + '1'
int("abc")
f = open('test.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as error:
print('出错了!\n原因是:' + str(error))
出错了!
原因是:unsupported operand type(s) for +: 'int' and 'str'
try-except-finally语句
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
finally:
无论如何都会被执行的代码
不管 try 子句里面有没有发生异常, finally 子句都会执行。如果一个异常在 try 子句里被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2, 1)
result is 2.0
executing finally clause
try-except-else语句
如果在 try 子句执行时没有发生异常,Python将执行 else 语句后的语句
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
使用 except 而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所
有的异常。
try:
检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
发生以上多个异常中的一个,执行这块代码
else:
如果没有异常执行这块代码
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
fh.close()
内容写入文件成功
注意: else 语句的存在必须以 except 语句的存在为前提,在没有 except 语句的 try 语句中使用 else 语句,会引发
语法错误。
raise语句
Python 使用 raise 语句抛出一个指定的异常。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
An exception flew by!
出现异常后的处理代码
finally:
无论如何都会被执行的代码
不管 try 子句里面有没有发生异常, finally 子句都会执行。如果一个异常在 try 子句里被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2, 1)
result is 2.0
executing finally clause
try-except-else语句
如果在 try 子句执行时没有发生异常,Python将执行 else 语句后的语句
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
使用 except 而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所
有的异常。
try:
检测范围
except(Exception1[, Exception2[,...ExceptionN]]]):
发生以上多个异常中的一个,执行这块代码
else:
如果没有异常执行这块代码
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
fh.close()
内容写入文件成功
注意: else 语句的存在必须以 except 语句的存在为前提,在没有 except 语句的 try 语句中使用 else 语句,会引发
语法错误。
raise语句
Python 使用 raise 语句抛出一个指定的异常。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
An exception flew by!