Task 01 从变量到异常处理(Day1:注释、变量与数据类型、运算符、位运算)

一、学习内容概括

首先附上学习地址阿里云天池Python训练营
学习内容如下:

二、具体学习内容

1.注释

为程序添加注释可以提高程序的可读性,Python中注释分为单行注释多行注释。同时,注释也是调试程序的一种重要方式,某些时候,我们不希望编译、执行程序中的某些代码,这时就可以将这些代码注释掉。

  • 单行注释
    单行注释用一个井号#表示
# 这是一个注释
print("Hello world")

# Hello world
  • 多行注释
    多行注释用三个单引号''' '''或者三个双引号""" """表示
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
print("Hello china") 
# Hello china

"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号 
这是多行注释,用三个双引号
"""
print("hello china") 
# hello china

2.运算符

  • 算数运算符
名称 操作符 示例
+ 1+1
- 2-1
* 3*4
/ 3/4
整除 // 3//4
取余 % 3%4
** 2**3
print(1 + 1)  # 2
print(2 - 1)  # 1
print(3 * 4)  # 12
print(3 / 4)  # 0.75
print(3 // 4)  # 0
print(3 % 4)  # 3
print(2 ** 3)  # 8
  • 比较运算符
名称 操作符 示例
大于 > 2>1
大于等于 >= 2>=4
小于 < 1<2
小于等于 <= 5<=2
等于 == 3==4
不等于 !== 3!=5
print(2 > 1)  # True
print(2 >= 4)  # False
print(1 < 2)  # True
print(5 <= 2)  # False
print(3 == 4)  # False
print(3 != 5)  # True
  • 逻辑运算符
    and、或or、非not
print((3 > 2) and (3 < 5))  # True
print((1 > 3) or (9 < 2))  # False
print(not (2 > 1))  # False
  • 位运算符
    位运算符可以直接操作数值的原始bit位,通常在图形、图像处理和创建设备驱动等底层开发中使用。Python支持位运算符有一下6个:
名称 操作符 示例
按位与 & 4&5
按位或 4竖5
按位取反 ~ ~4
按位异或 ^ 4^5
左移 << 4<<2
右移 >> 4>>2
print(bin(4))  # 0b100
print(bin(5))  # 0b101
print(bin(~4), ~4)  # -0b101 -5
print(bin(4 & 5), 4 & 5)  # 0b100 4
print(bin(4 | 5), 4 | 5)  # 0b101 5
print(bin(4 ^ 5), 4 ^ 5)  # 0b1 1
print(bin(4 << 2), 4 << 2)  # 0b10000 16
print(bin(4 >> 2), 4 >> 2)  # 0b1 1
  • 三元运算符

也叫三目运算符,通过if语句来实现。
语法结构:

True_statements if  expression else False_statements

运算规则:
先对逻辑表达式expression进行求职,若为True,则执行并返回True_statements的值;若为False,则执行并返回False_statements的值。
值得注意的是
Python允许三元运算符的True_statements或False_statements中放置多条语句,主要支持两种放置方式。第一种,多条语句用英文逗号隔开,每条语句都会执行,程序返回多条语句的返回值组成的元组;第二种,多条语句用英文分号隔开,每条语句都会执行,程序只返回第一条语句的返回值

a = 5
b = 3
st = print('5比3大'), 'a大于b' if a > b else 'a不大于b'
print(st)

#5比3大
#(None, 'a大于b')

因为print函数没有返回值,所以返回一个None

  • 其他运算符

主要介绍两组运算符,一组是 isnot is,另一组是 innot in
innot in 主要比较某个对象在不在某个序列对象中,比如字符串中是否包含了某个字母,列表中是否包含了某个元素等等,比较简单。我们主要看下isnot is

比较的对象是不可变类型:

a = "hello"
b = "hello"
print(a is b, a == b)  # True True
print(a is not b, a != b)  # False False

比较的对象是可变类型:

a = ["hello"]
b = ["hello"]
print(a is b, a == b)  # False True
print(a is not b, a != b)  # True False

注意

  • is, is not 对比的是两个变量的内存地址

  • ==, != 对比的是两个变量的值

  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not==!= 是完全等价的。

  • 对比的两个变量,指向的是地址可变的类型(listdicttuple等),则两者是有区别的。

  • 运算符的优先级

  • 一元运算符优于二元运算符。例如3 ** -2等价于3 ** (-2)

  • 先算术运算,后移位运算,最后位运算。例如 1 << 3 + 2 & 7等价于 (1 << (3 + 2)) & 7

  • 逻辑运算最后结合。例如3 < 4 and 4 < 5等价于(3 < 4) and (4 < 5)

print(-3 ** 2)  # -9
print(3 ** -2)  # 0.1111111111111111
print(1 << 3 + 2 & 7)  # 0
print(-3 * 2 + 5 / -2 - 4)  # -12.5
print(3 < 4 and 4 < 5)  # True

三、变量与数据类型

  • 变量和赋值、输出函数print()

Python是一门弱类型语言,弱类型语言有两个典型特征:一是变量无需声明即可直接赋值,对一个第一次使用的变量赋值就相当于定义了一个新变量;二是变量的数据类型可以动态改变,取决于被赋值变量所引用的那个对象。

关于print()函数:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  • 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;

  • 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;

  • 关键字参数end是输出结束时的字符,默认是换行符\n

  • 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;

  • 关键字参数flush是立即把内容输出到流文件,不作缓存。

  • 三种简单的数据类型

整型(int

a = 1031
print(a, type(a))
# 1031 <class 'int'>

浮点型(float

print(1, type(1))
# 1 <class 'int'>

print(1., type(1.))
# 1.0 <class 'float'>

a = 0.00000023
b = 2.3e-7
print(a)  # 2.3e-07
print(b)  # 2.3e-07

对于浮点型,有时候我们想保留浮点型的小数点后 n 位。可以用decimal 包里的 Decimal 对象和 getcontext() 方法来实现。

import decimal
from decimal import Decimal
a = decimal.getcontext()
print(a)

# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
# capitals=1, clamp=0, flags=[], 
# traps=[InvalidOperation, DivisionByZero, Overflow])

getcontext() 显示了 Decimal 对象的默认精度值是 28 位 (prec=28)

下面通过用 getcontext().prec来调整精度

b = Decimal(1) / Decimal(3)
print(b)

# 0.3333333333333333333333333333
decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)

# 0.3333

布尔型(bool

print(True + True) # 2
print(True + False)  # 1
print(True * False)  # 0
  • 类型转换
  • 转换为整型 int(x, base=10)
  • 转换为字符串 str(object='')
  • 转换为浮点型 float(x)

四、位运算

  • 原码、反码、补码

为了计算的方面(解决减法问题),计算机底层使用补码的形式保存所有整数。参考博客原码,反码,补码的深入理解与原理。整数的原码、反码、补码都一样;负数的反码是将原码的符号位不变,其他位全部取反,补码就是反码+1。(反码的另外一种计算方式,将原码自低位到高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。)

  • 按位运算
    1.按位非操作 ~

    ~num的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 ~ 运算中同样会取反。

    2.按位与操作 &

    只有两个对应位都为 1 时才为 1

    1. 按位或操作 |

    只要两个对应位中有一个 1 时就为 1

    4.按位异或操作 ^

    只有两个对应位不同时才为 1,异或满足交换律和结合律

    5.按位左移操作 <<

    num << inum的二进制表示向左移动i位所得的值。

    6.按位右移操作 >>

    num >> inum的二进制表示向右移动i位所得的值。

  • 位运算实现快速计算

1.计算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.通过 a & (-a) 快速获取a的最后为 1 位置的整数。

00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1

00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
  • 位运算实现整数集合

一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。

比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。

元素与集合的操作:

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)
  • Python中bin()的输出
print(bin(3))  # 0b11
print(bin(-3))  # -0b11

print(bin(-3 & 0xffffffff))  
# 0b11111111111111111111111111111101

print(bin(0xfffffffd))       
# 0b11111111111111111111111111111101

print(0xfffffffd)  # 4294967293

Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号.

Python中的整型是补码形式存储的。

Python中整型是不限制长度的不会超范围溢出。

所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351