python 取反_学习打卡1:Python基础入门:从变量到异常处理

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

1.注释

在 Python 中,#表示注释,作用于整行。

''' '''或者 """ """表示区间注释,在三引号之间的所有内容被注释。

2.运算符

~运算中,4的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0100执行~运算,即~4后:1111 1111 1111 1111 1111 1111 1111 1011,即结果为-5。本例子中的1111 1111 1111 1111 1111 1111 1111 1011其符号为是1,表明它是负数,欲求其源码,需要先对其取反再加1:0000 0000 0000 0000 0000 0000 0000 0100+1=0000 0000 0000 0000 0000 0000 0000 0000 0101,然后在得到的源码前加一个负号,即可得到-5的结果。

逻辑运算符:

and 与 or 或 not 非

例子:print((3 > 2) and (3 < 5))

print((1 > 3) or (9 < 2))

print(not (2 > 1))

结果:

ef75afb1b0428474688c419c776f35a0.png

其他运算符:

in 与 not in 是用来作为逻辑判断的一种方式。in 右侧的内容里,是否包含了左侧的内容。 包含返回真,不包含返回假。not in 右侧的内容里是否不包含左侧的内容。不包含返回真,包含返回假。in 与 not in 可以放在任何允许添加条件判断的位置。

is和is not比较的是两个变量的内存地址,而==和!=比较的是两个变量的值。

da73b92ca132f4d7bbba39c3a1c49b4e.png

ba9c0dd9aefd40afb18a72c13a4a4001.png

d11dee4e0d1884f88c60014fe4829a91.png

注:在比较的两个变量指向的地址都是不可变(数字、字符串、元组、不可变集合)的情况下,两组比较符号是完全等价的。对比的两个变量,指向的是地址可变的类型(列表、字典、可变集合),则两者是有区别的。

运算符的优先级:

  • 一元运算符优于二元运算符。例如3 ** -2等价于3 ** (-2)
  • 先算术运算,后移位运算,最后位运算。例如 1 << 3 + 2 & 7等价于 (1 << (3 + 2)) & 7
  • 逻辑运算最后结合。例如3 < 4 and 4 < 5等价于(3 < 4) and (4 < 5)

3.变量与赋值

  • 在使用变量之前,需要对其先赋值。
  • 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
  • Python 变量名是大小写敏感的,foo != Foo。

学习中遇到的pop()函数是获取并删除指定位置元素,再次输出之后的结果如下:

d68abd1a749e8504ba0ff0c57d09a7cf.png

set是一个无序且不重复的元素集合。集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键。集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), 用 for 循环迭代集合的成员。但是因为集合本身是无序的,所以导致pop()函数每次所获得的元素不同。

4.数据类型和转换

Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。可以用dir()来查看属性和方法。

cae0df6bfe445a3c4f8528efdc95dc92.png

保留浮点型的小数点后面n位,可以用decimal包里的Decimal对象和getContext()方法来实现。(使用之前记得引入decimal包,不然程序会报错。Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。)使用getContext().prec来调整数字的精度。

eb4d741b99a7aca3ed4dd700e0df3089.png

d3770f32250e3283b9447936fc081970.png

布尔 (boolean) 型变量只能取两个值,True和False。当把布尔型变量用在数字运算中,用1和0代表True和False。

a39c7adbea422b59e9ee33cb9e4b380a.png

除了直接给变量赋值 True 和 False,还可以用 bool(X) 来创建变量,其中 X 可以是

  • 基本类型:整型、浮点型、布尔型
  • 容器类型:字符串、元组、列表、字典和集合

bool作用在基本类型变量:X只要不是整型0、浮点型0.0,bool(X)就是True,其余就是False。bool作用在容器类型变量:X只要不是空的变量,bool(X)就是True,其余就是False。确定bool(X) 的值是True还是False,就看X是不是空,空的话就是False,不空的话就是True。

  • 对于数值变量,0, 0.0 都可认为是空的。
  • 对于容器变量,里面没元素就是空的。

type()和isinstance()可以获得类型信息。type()不会认为子类是一种父类类型,不考虑继承关系;isinstance()会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用isinstance()。

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

f2e3f2f840efba0e4e371a1515d9af19.png

5.print()函数

  • 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
  • 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
  • 关键字参数end是输出结束时的字符,默认是换行符n
  • 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
  • 关键字参数flush是立即把内容输出到流文件,不作缓存。
  • 没有参数时,每次输出后都会换行。每次输出结束都用end设置的参数&结尾,并没有默认换行。item值与'another string'两个值之间用sep设置的参数&分割。由于end参数没有设置,因此默认是输出解释后换行,即end参数的默认值为n

二.位运算

1.原码、反码和补码

二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。原码:就是其二进制表示(注意,有一位符号位)。反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。补码:正数的补码就是原码,负数的补码是反码+1。符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。

例:-3的原码:10 00 00 11 反码:11 11 11 00 补码:11 11 11 01

2.按位运算

按位非操作:~4=-5 ~把num的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在~运算中同样取反。

按位与运算:1&1=1 1&0=0 0&0=0 只有两个对应位都为 1 时才为 1

按位或操作:1|1=1 1|0=1 0|0=0 有一个对应位都为 1 时就为 1

按位异或操作:1^1=0 1^0=1 0^0=0 只有两个对应位不同是才为1(性质:满足交换律和结合律)

按位左移右移操作:

00 00 00 11->3 3<<2 00 00 11 00->12

00 00 10 11->11 11>>2 00 00 00 10->2

3.利用位运算实现快速计算

可以使用<<,>>快速计算2的倍数问题。

n << m -> 计算 n*(2^m),即乘以 2 的 m 次方
n >> m -> 计算 n/(2^m),即除以 2 的 m 次方

三.条件语句

1.if语句

if 语句的expr_true_suite代码块只有当条件表达式exepression结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句。单个 if 语句中的exepression条件表达式可以通过布尔操作符and,or和not实现多重条件判断。

4865d21db3105ec47f95c9730afb4743.png

2.if-else语句

Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。if语句支持嵌套,即在一个if语句中嵌入另一个if语句,从而构成不同层次的选择结构。Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意else的悬挂问题。

f3aa6f4d8979e7d9850f800aeca408d7.png

3.if-elif-else语句

elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。

08acf615e07506bf7360fc5100020cad.png

d3ef8a18ea02f7ed7a0c40dfc6cbf941.png

4.assert关键词

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

代码如下是报错:

1c7a651e0f46e71ff48bbd718bbe95e9.png

将pop()函数注释掉就不会报错:

3225c0d3d518f2e7667b3cdce4fe3e63.png

四.循环语句

1.range()函数

range(x,y)函数从x参数的值开始到y参数的值结束的数字序列,序列包括x的值但不包含y的值。

85422c2f078925f5705c66c01a24e63e.png

2.enumerate()函数

enumerate(sequence, [start=0])

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

a6dc458d04ba948e8c5194323ae68313.png

enumerate()与 for 循环的结合使用。用enumerate(A)不仅返回了A中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用enumerate(A, j)还可以确定索引起始值为j

16f644d6a3932c04335a249ce3bfd107.png

f94c3681bbd556940e65d181c0a5df06.png

3.break、continue语句

break语句可以跳出当前所在层的循环。continue终止本轮循环并开始下一轮循环。

4.pass语句

pass语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而pass语句就是用来解决这些问题的。pass是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。

fe1ec2d3c3d14124f433b6ef95f299d2.png

5.推导式

列表推导式 [ expr for value in collection [if condition] ]

fa998ddcc2184a4c7f4d594576537efc.png

元组推导式 ( expr for value in collection [if condition] )

0aa3fa904dbb9af18f94472241c27bf4.png

字典推导式 { key_expr: value_expr for value in collection [if condition] }

6d15008ea8fce191639609523872ce6c.png

集合推导式 { expr for value in collection [if condition] }

129bd4c74dd06535e4dde09f19f5cab1.png

五.异常处理

1. Python 标准异常总结

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

异常体系中部分关系如下:

359cd5cc7cf06843b7cb8205deb0fd7b.png

2.try-expect语句

try:
检测范围except Exception[as reason]:
出现异常后的处理代码

  • 首先,执行try子句(在关键字try和关键字expect之间的语句)
  • 如果没有异常发生,忽略expect子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和expect之后的名称相符,那么对应的expect子句将被执行。最后执行try- expect语句之后的代码。
  • 如果一个异常没有与任何的expect匹配,那么这个异常将会传递给上层的try中。

一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyErrorLookupError的子类,且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。

3.try-expect-finally语句

try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码

不管try子句里面有没有发生异常,finally子句都会执行。

如果一个异常在try子句里被抛出,而又没有任何的expect把它截住,那么这个异常会在finally子句执行后被抛出。

4.try-expect-else语句

如果在try子句执行时没有发生异常,Python将执行else语句后的语句。

try:
检测范围except:
出现异常后的处理代码else:
如果没有异常执行这块代码

使用except而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。try: 检测范围 except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 else: 如果没有异常执行这块代码。

例子:

67f41f6e0ce92e312d9849334a9e356a.png

注意:else语句的存在必须以expect语句的存在为前提,在没有expect语句的try语句中使用else语句,会引发语法错误。

5.raise语句

python中使用raise语句抛出一个指定异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值