阿里云天池 Python训练营Task1:从变量到异常处理

2021/4/23 22:57:56

本文主要是介绍阿里云天池 Python训练营Task1:从变量到异常处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5176.22758685.J_6770933040.1.6f103da1tESyzu

目录

一、学习知识点概要

二、学习内容

I.变量、运算符与数据类型

II.位运算

III.条件语句

IV.循环语句 

V.异常处理

三、学习问题与解答

四、学习思考与总结


一、学习知识点概要

Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。

本次学习包括以下内容:

  • 变量、运算符与数据类型
  • 位运算
  • 条件语句
  • 循环语句
  • 异常处理

二、学习内容

I.变量、运算符与数据类型

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。

注:

  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
  • 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。

5.基本数据类型与转换

基本数据类型有整形(int)、浮点型(float)、布尔型(boolean),可通过type()方法查看对象的数据类型,还可以用isinstance()方法查看两种数据的类型是否相同。

  •    整形(int)即为内容为整数的数据,如:5,112,-32等;
  •    浮点型(float)为含有小数点的数据,如:1.0,2.3e-07等;
  •    布尔型(boolean)数据只能取两个值,True和False。但布尔型的数据参与数字运算时,用1和0分别代表True和False。

如果我们想保留浮点型的小数点后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。

类型转换

  • 转换为整型,用int(x)
  • 转换为浮点型,用float(x)
  • 转换为字符串,用str(object=' ')

II.位运算

位运算是直接对整数在二进制中进行操作。我们的电脑电路设计都是基于二进制的,所以在二进制层面效率很高。通常位运算多用在对程序效率要求很高的场景。

1.原码、反码、补码

二进制有三种不同的表示形式:原码、反码和补码,计算机内部用补码表示。

  • 原码:就是对象的二进制表示。原码的首位为符号位,用于表示数据的正负,当对象为非负数时符号位为0,负数时符号位为1。取该整数的绝对值的二进制,再加上符号位。原码只是为了让我们看二进制更直观,直接看出正负数和比较大小。但原码不是计算机保存的二进制,所以不能直接参与计算。例:
  • 整数绝对值绝对值的二进制值原码
    55000010100000101
    -55000010110000101
  • 反码:反码主要是针对负数的处理,非负数的反码就是原码。在原码的基础上,符号位不变,其他数值位取反,即把1变成0,把0变成1。反码是为了在计算机中存储二进制,但非真正的二进制值,所以也不直接参与计算。例如:
  • 整数绝对值原码反码
    550000010100000101
    -551000010111111010
  • 补码:补码主要也是针对负数。非负数不变,而负数是在反码的基础上加1。
  • 整数绝对值反码补码
    550000010100000101
    -551111101011111011

2.按位运算

上文提到的位运算符就是对两个数的补码直接进行操作。主要是在对应的位置上进行逻辑运算。以5和3为例:

运算符&|^~>><<
表达式5&35|35^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
  •  通过 a&(-a) 快速获取a的最后为 1 位置的整数

III.条件语句

Python的条件语句为if-elif-else语句,与其他语言的用法相似,此处不多赘述。

assert关键词

这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssetionError的异常。在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。

a=5
b=6
assert a>b

#AssertionError

IV.循环语句 

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

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

4.enumerate()方法

enumerate(sequence,start=0),参数start可省略,默认为0

  • sequence:一个序列、迭代器或其他支持迭代对象。
  • start:下标起始位置。
  • 返回 enumerate(枚举) 对象

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}

V.异常处理

异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。

1.Python标准异常总结

  • BaseException:所有异常的 基类
  • Exception:常规异常的 基类
  • StandardError:所有的内建标准异常的基类
  • ArithmeticError:所有数值计算异常的基类
  • FloatingPointError:浮点计算异常
  • OverflowError:数值运算超出最大限制
  • ZeroDivisionError:除数为零
  • AssertionError:断言语句(assert)失败
  • AttributeError:尝试访问未知的对象属性
  • EOFError:没有内建输入,到达EOF标记
  • EnvironmentError:操作系统异常的基类
  • IOError:输入/输出操作失败
  • OSError:操作系统产生的异常(例如打开一个不存在的文件)
  • WindowsError:系统调用失败
  • ImportError:导入模块失败的时候
  • KeyboardInterrupt:用户中断执行
  • LookupError:无效数据查询的基类
  • IndexError:索引超出序列的范围
  • KeyError:字典中查找一个不存在的关键字
  • MemoryError:内存溢出(可通过删除对象释放内存)
  • NameError:尝试访问一个不存在的变量
  • UnboundLocalError:访问未初始化的本地变量
  • ReferenceError:弱引用试图访问已经垃圾回收了的对象
  • RuntimeError:一般的运行时异常
  • NotImplementedError:尚未实现的方法
  • SyntaxError:语法错误导致的异常
  • IndentationError:缩进错误导致的异常
  • TabError:Tab和空格混用
  • SystemError:一般的解释器系统异常
  • TypeError:不同类型间的无效操作
  • ValueError:传入无效的参数
  • UnicodeError:Unicode相关的异常
  • UnicodeDecodeError:Unicode解码时的异常
  • UnicodeEncodeError:Unicode编码错误导致的异常
  • UnicodeTranslateError:Unicode转换错误导致的异常

2.Python标准警告总结

  • Warning:警告的基类
  • DeprecationWarning:关于被弃用的特征的警告
  • FutureWarning:关于构造将来语义会有改变的警告
  • UserWarning:用户代码生成的警告
  • PendingDeprecationWarning:关于特性将会被废弃的警告
  • RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
  • SyntaxWarning:可疑语法的警告
  • ImportWarning:用于在导入模块过程中触发的警告
  • UnicodeWarning:与Unicode相关的警告
  • BytesWarning:与字节或字节码相关的警告
  • ResourceWarning:与资源使用相关的警告

3.try - except语句

'''
try - except语句结构如下:

try:
    检测范围
except Exception[as reason]:
    出现异常后的处理代码
'''
try:
    f = open('test.txt')
    print(f.read())
    f.close()
except OSError:
    print('打开文件出错')

# 打开文件出错
  • 首先执行try子句(即“检测范围”那块代码)
  • 若无异常发生,则忽视except语句
  • 若发生异常,那try子句的余下部分会被忽略。同时如果异常的类型和except后的异常类型相同,则会执行except子句
  • 如果一个异常没有与任何的except匹配,这个异常将会被传递到上层的try中
  • 一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行
  • 一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。

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来表示这个整数在不在集合里,然后那些运算也就能看明白了。

四、学习思考与总结

现在还有的问题基本上都是例程里出现的一些陌生的函数方法不知道什么作用,我还需要通过继续学习才能弄明白。



这篇关于阿里云天池 Python训练营Task1:从变量到异常处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程