本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5176.22758685.J_6770933040.1.6f103da1tESyzu
目录
一、学习知识点概要
二、学习内容
I.变量、运算符与数据类型
II.位运算
III.条件语句
IV.循环语句
V.异常处理
三、学习问题与解答
四、学习思考与总结
Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。
本次学习包括以下内容:
1.注释
在Python中,#表示注释,作用于整行,''' '''或""" """表示区间注释,在三个引号之间的信息为注释,例如:
""" 多行注释 三个双引号 """ print('Hello World!') #单行注释 ''' 多行注释 三个单引号 '''
2.位运算符
运算符 | 含义 | 功能 |
& | 按位与 | 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0 |
| | 按位或 | 两个相应的二进制位中只要有一个为1,该位的结果值为1 |
^ | 按位异或 | 若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真) |
~ | 取反 | ~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0 |
>> | 左移 | 左移运算符是用来将一个数的各二进制位全部左移n位,右补0 |
<< | 右移 | 表示将a的各二进制位右移n位,移到右端的低位被舍弃,对无符号数,高位补0 |
对位运算符的运用见后文“位运算”部分
3.三目运算符
对分支语句,例如:
a=2 b=5 if a>b: value=a else: value=b print(value) #输出结果为5
在Python中可以运用更简洁的写法:
a=2 b=5 value=a if a>b else b print(value)
使用 if else 实现三目运算符(条件运算符)的格式如下:
exp1 if contion else exp2
condition 是判断条件,exp1 和 exp2 是两个表达式。如果 condition 成立(结果为真),就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立(结果为假),就执行 exp2,并把 exp2 的结果作为整个表达式的结果。
4.其他运算符
运算符 | 名称 | 示例 |
in | 存在 | 1 in [1,2,3] |
not in | 不存在 | 4 not in [1,2,3] |
is | 是 | 'hello' is 'hello' |
is not | 不是 | 'hello' is not 'Hello' |
运算结果为布尔型数据,以上示例结果都为True。
注:
5.基本数据类型与转换
基本数据类型有整形(int)、浮点型(float)、布尔型(boolean),可通过type()方法查看对象的数据类型,还可以用isinstance()方法查看两种数据的类型是否相同。
如果我们想保留浮点型的小数点后n位,可以引入decimal包里的Decimal对象和getcontext()方法来实现,Decimal对象的默认精度为28位,例如:
import decimal from decimal import Decimal x=Decimal(2)/Decimal(7) print(x) #结果为0.2857142857142857142857142857,有28位小数 decimal.getcontext().prec=5 x=Decimal(2)/Decimal(7) print(x) #结果为0.28571,有5位小数
创建布尔型变量除了直接给变量赋值和用运算符之外,还可以用bool(x)方法创建。其中x可以是
当x为整形或浮点型时,若x=0或x=0.0,bool(x)就为False,否则为True;
当x为容器类型的数据时,若x为空,bool(x)为False,若x 为非空,bool(x)为True。
类型转换
位运算是直接对整数在二进制中进行操作。我们的电脑电路设计都是基于二进制的,所以在二进制层面效率很高。通常位运算多用在对程序效率要求很高的场景。
1.原码、反码、补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部用补码表示。
整数 | 绝对值 | 绝对值的二进制值 | 原码 |
5 | 5 | 0000101 | 00000101 |
-5 | 5 | 0000101 | 10000101 |
整数 | 绝对值 | 原码 | 反码 |
5 | 5 | 00000101 | 00000101 |
-5 | 5 | 10000101 | 11111010 |
整数 | 绝对值 | 反码 | 补码 |
5 | 5 | 00000101 | 00000101 |
-5 | 5 | 11111010 | 11111011 |
2.按位运算
上文提到的位运算符就是对两个数的补码直接进行操作。主要是在对应的位置上进行逻辑运算。以5和3为例:
运算符 | & | | | ^ | ~ | >> | << |
表达式 | 5&3 | 5|3 | 5^3 | ~5 | 5<<2 | 3>>1 |
二进制表示 | 00000101 & 00000011 | 00000101 | 00000011 | 00000101 ^ 00000011 | ~00000101 | 00000101<<2 | 00000011>>1 |
运算结果 | 00000001 1 | 00000111 7 | 00000110 6 | 11111010 -6 | 00010100 20 | 00000001 1 |
3.利用位运算实现快速计算
>>
快速计算2的倍数问题:n << 1 #计算 n*2 n >> 1 #计算 n/2,负奇数的运算不可用 n << m #计算 n*(2^m),即乘以 2 的 m 次方 n >> m #计算 n/(2^m),即除以 2 的 m 次方 1 << n #计算 2^n,即2的n次方
a^=b b^=a a^=b
Python的条件语句为if-elif-else语句,与其他语言的用法相似,此处不多赘述。
assert关键词
这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssetionError的异常。在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
a=5 b=6 assert a>b #AssertionError
Python中的While循环和For循环与其他语言中的用法相似,此处只写一些不同的地方。
1.while - else循环
while - else循环的结构如下:
while 布尔表达式: 代码块 else: 代码块
当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句(如break),将不执行else代码块的内容。
2.for - else循环
与while - else循环类似,当for循环正常执行完的情况下,执行else输出,如果在循环途中执行了跳出循环的语句,则不会执行else的内容。例如:
for 循环变量 in 可迭代对象: 代码块 else: 代码块
3.range()方法
range() 返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印(print)的时候不会打印列表。
range(start=0,stop,step=1),range()方法有三个参数:start,stop,step
4.enumerate()方法
enumerate(sequence,start=0),参数start可省略,默认为0
enumerate(X)不仅返回了X中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用enumerate(X,j)还可以确定索引起始值为j
enumerate()方法可与for循环配合使用:
seq=['one', 'two', 'three'] for i, element in enumerate(seq): print(i, element) ''' 0 one 1 two 2 three '''
5.continue语句
continue语句用于终止本轮循环并开始下一轮循环,如:
for i in range(1,11): if i != 10: print('i不是10') continue print('i是10') ''' i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i是10 '''
6.pass语句
pass语句的意思是“跳过”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,pass语句就是用来解决这个问题的。其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。
7.推导式
#推导式结构:[ 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]
#推导式结构( expr for value in collection [if condition] ) a = (x for x in range(10)) print(a) # <generator object <genexpr> at 0x0000025BE511CC48> print(tuple(a)) # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
#推导式结构{ key_expr: value_expr for value in collection [if condition] } b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0} print(b) # {0: True, 3: False, 6: True, 9: False}
#推导式结构{ expr for value in collection [if condition] } c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]} print(c) # {1, 2, 3, 4, 5, 6}
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
1.Python标准异常总结
2.Python标准警告总结
3.try - except语句
''' try - except语句结构如下: try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 ''' try: f = open('test.txt') print(f.read()) f.close() except OSError: print('打开文件出错') # 打开文件出错
4.try - except - finally语句
无论try子句执行时有没有发生异常,最终都会执行finally子句。如果执行try子句时发生异常,且没有任何except语句把异常拦截的话,会先执行finally子句再抛出异常。结构为:
try: 检测范围 except: 出现异常后的处理代码 finally: 无论结果如何都执行这块代码
5.try - except - else语句
如果在执行try子句时没有发生异常,则执行else子句。结构为:
try: 检测范围 except: 出现异常后的处理代码 else: 如果没有异常执行这块代码
6.raise语句
raise语句用于抛出一个指定的异常。例如:
try: raise NameError('HiThere') except NameError: print('An exception flew by!') # An exception flew by!
在学习Task1时,出现的主要问题在于对位运算的不了解,例如在用位运算实现整数集合时,就不知道为什么那些整数集合可以表示为01的长串信息。通过在网上搜索才了解到是以01长串的位置来表示这个整数位置上的符号是否是1来表示这个整数在不在集合里,然后那些运算也就能看明白了。
现在还有的问题基本上都是例程里出现的一些陌生的函数方法不知道什么作用,我还需要通过继续学习才能弄明白。