zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Datawhale组队学习 -- Task 1:变量、运算符、数据类型及位运算

学习变量 -- 数据类型 运算 运算符 Task Datawhale
2023-06-13 09:14:28 时间

1. 注释

  • 概念

代码中的注释经常用来表达代码内容的含义或者保存一些不执行但要保留的代码进行对比查看

  • 代码
# 你好,世界
'''
有些人心如草木,
    却向阳而生
'''
print("余生大大 --->")
  • 执行结果
  • 总结
    • #是一个单行注释
    • ''' ''' 或 """ """ 是多行注释

2. 计算符

算数运算符

符号

操作符

名称

示例

+

1 + 1

-

2 - 1

*

3 * 4

/

3 / 4

//

整除(地板除)

3 // 4

%

取余

3 % 4

**

2 ** 3

代码

print(1 + 1)  # 加
print(2 - 1)  # 减
print(3 * 7)  # 称
print(7 / 9)  # 除
print(41 // 7)# 整除,舍弃小数
print(5 % 3)  # 取余数
print(2 ** 9) # 幂

结果

比较运算符

符号

操作符

名称

示例

>

大于

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

(3 > 2) and (3 < 5)

or

(1 > 3) or (9 < 2)

not

not (2 > 1)

代码

print((3 > 2) and (3 > 5))  # and 的条件必须都符合才输出true
print((1 > 3) or (9 > 2))  # or 的条件只要一个符合就输出true
print(not (2 > 1))  # not相当于取反,结果为true加上not就输出反向结果

结果

位运算符

符号

操作符

名称

示例

~

按位取反

~4

&

按位与

4 & 5

|

按位或

4 | 5

^

按位异或

4 ^ 5

<<

左移

4 << 2

>>

右移

4 >> 2

按位取反(~

按位取反运算符~为单目运算符(只有一个操作数),右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。也就是把数值在内存中的二进制存储进行取反。
例如,~9可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
-----------------------------------------------------------------------------------
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110  (-10 在内存中的存储)

按位与(&

按位与运算符&的运算规则是:只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。也就是说两个数值的内存二进制0,1对比,1&1为1 0&0为0 1&0为0

-9&5可以转换成如下的运算:结果为5
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
  0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)

按位或(|)

按位或运算符|的运算规则是:两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为 1,0|0为0,1|0 为1,这和逻辑运算中的||非常类似。跟上面的相反,1|1为1,0|0为0,1|0为1

-9&5可以转换成如下的运算:结果为-9
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)

按位异或(^

按位异或运算^的运算规则是:参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为 1,0^0为 0,1^1为 0。  

-9&5可以转换成如下的运算:结果为-14
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
  1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010  (-14 在内存中的存储)

左移运算符(<<

Python 左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补 0。


9<<3可以转换为如下的运算:结果为72
<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000  (72 在内存中的存储)

如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。
9<<3可以理解为 9*2的3次方:9*(2*2*2)=72

右移运算符(>>

Python 右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。


9>>3可以转换为如下的运算:结果为1
>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001  (1 在内存中的存储)

(-9)>>3可以转换为如下的运算:结果为-2
>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
-----------------------------------------------------------------------------------
   1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110  (-2 在内存中的存储)

上面两个可以看出9>>3高位丢的0就补0,(-9)>>3丢的1就补1

如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。

代码

#bin() 返回一个整数 int 或者长整数 long int 的二进制表示。
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

结果

三元运算符

代码

x, y = 4, 5
small = x if x < y else y # 如果x < y则输出前面的x 否则输出 y
print(small)  # 4

结果

其他运算符

符号

操作符

名称

示例

in

存在

'A' in ['A', 'B', 'C']

not in

不存在

'h' not in ['A', 'B', 'C']

is

"hello" is "hello"

is not

不是

"hello" is not "hello"

代码

# is 和 not in
letters = ['A', 'B', 'C']
print('A' in letters) # 如果A存在于那个数组中为真
print('A' not in letters) # 如果A不存在于那个数组中为真

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

注意

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

结果

运算符的优先级

  • 一元运算符优于二元运算符。例如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

3. 变量和赋值

  • 概念
  1. 在使用变量之前,需要对其先赋值。
  2. 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
  3. Python 变量名是大小写敏感的,foo != Foo。
  • 代码
# 纯字符类型则拼接
yu = "心如草木"
sheng = "向阳而生"
print(yu + "," + sheng)
# 数值类型则计算
num = 1;
numT = 3;
print(num + numT)
# 字符类和数值类不能混用
print(num + numT + yu)
  • 执行结果

4. 数据类型与转换

  • 概念

只要是对象,就有相应的属性 (attributes) 和方法(methods),在开发时经常需要将数据类型转换和统一。

  • 查看对象类型:type(x)
a = 1031
print(a, type(a))
  • 执行结果
  • 转换
a = 122
# 数值转字符串
a = str(a);
print(a, type(a))
# 字符串转浮点
a = float(a);
print(a, type(a))
# 浮点转数值
a = int(a);
print(a, type(a))
# 数值转布尔(bool如果是0、0.0或者空字符串及空的变量则为false)
a = bool(a)
print(a, type(a))
  • 执行结果

练习题

  1. 怎样对python中的代码进行注释?
    1. #:单行注释
    2. ''' ''' 和 """ """: 多行注释
  2. python有哪些运算符,这些运算符的优先级是怎样的?
    1. 一元运算优先二元运算
    2. 先执行算数的再执行移位运算最后执行位运算
  3. python 中 isis not 与 ==!= 的区别是什么?
    1. is 和 is not比较的是变量的内存地址(家住在哪)
    2. == 和 != 比较的是变量的值(人长的一不一样)
  4. python 中包含哪些数据类型?这些数据类型之间如何转换?
    1. int,str,float,bool(整形,字符,浮点型,布尔型)
    2. int(x),str(x),float(x),bool(x) (转换函数)