学习Python-Task 1-变量、运算符、数据类型、位运算

**

(1)变量,运算符,数据类型

**
知识点:

  1. 注释:
    #表示单行注释,’’’ ‘’’ 或者 “”" “”"表示多行注释

  2. 运算符
    // 整除(取商);% 取余;** 幂
    逻辑运算符:and 与;or 或;not 非 示例:not(2>1)
    位运算:~ 按位取反;& 按位与;` 按位或;^ 按位异或;<< 左移;>> 右移(这六个都是二进制运算)

注意:按位取反时,数据是以补码存储的,对于正整数4(0b100),按位取反得到(-0b011),但这是补码,将补码换算成原码得到(-0b101),即-5。正整数的补码=原码;负整数的补码=原码符号位不变,其他位按位取反加1。

print(bin(4))  # 0b100
print(bin(5))  # 0b101
print(bin(~4), ~4)  # -0b101 -5
print(bin(~5), ~5)  # -0b110 -6

三元运算符:

x, y = 4, 5
small = x if x < y else y
print(small)  # 4

其他运算符:
in 存在;not in 不存在;is 是;is not 不是(可用于列表元素查找,字符串对比);
is 和is not比较的是两个变量的内存地址,== 和!=比较的是变量的值;
两个变量都是地址不可变类型,is 、is not和==、!=等价;对于地址可变类型,有区别。

优先级:
一元运算符优于二元运算符,例如,3**-2等价于3**(-2),但-3**2 等于-9。
先算术运算,后移位,最后位运算。例如1<<3+2&7,先计算3+2,然后<<再&。
逻辑运算最后结合。

  1. 数据类型
    有时候我们想保留浮点型的小数点后 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])

# Decimal 对象的默认精度值是 28 位 (prec=28)。

b = Decimal(1) / Decimal(3)
print(b)
# 0.3333333333333333333333333333
decimal.getcontext().prec = 4  # 保留四位小数
c = Decimal(1) / Decimal(3)
print(c)
# 0.3333

对于布尔型,只要x不为0,0.0,或空的容器类型,bool(x)就是True,否则为False。

  1. print()
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
关键字参数end是输出结束时的字符,默认是换行符\n;
关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
关键字参数flush是立即把内容输出到流文件,不作缓存。

补充:

  1. bin()函数,返回二进制表示,用法:bin(x),x为int或long int型;返回值为字符串。x.bit_length()获取x的二进制表示的长度。
  2. type(x)函数,获取x的类型。不会认为子类是一种父类类型,不考虑继承关系。
  3. dir(x),获取x的属性和方法。
  4. isinstance(object,classinfo),获取类型信息,返回值为bool值,True或False。会认为子类是一种父类类型,考虑继承关系。推荐使用此函数判断两个类型是否相同。
  5. 类型转换:
    int(x,base=10),x必须是数字,或整数文本的字符串、字节或字节组,base是限制x的,默认是10,其有效值为0和2-36,0表示根据自行给出的x得出结果。无论base为多少,得到的都是十进制整数。
    str(object=‘’)/str(x)
    float(x)

练习:

  1. 怎样对python中的代码进行注释?
    单行注释:#
    多行注释:’’’ ‘’’ 或者 “”" “”"
  2. python有哪些运算符,这些运算符的优先级是怎样的?
    算术运算符、比较运算符、逻辑运算符、位运算符、三元运算符、其他运算符
    优先级:一元高于二元,算术>移位>其他位运算,逻辑运算符最后计算,最好使用括号区分,否则容易由于优先级问题出错。
  3. python 中 is, is not 与 ==, != 的区别是什么?
    is和is not比较的是地址,==和!=比较的是值。
  4. python 中包含哪些数据类型?这些数据类型之间如何转换?
    基本类型:整型int,浮点型float,布尔型bool
    容器:列表,元组,集合,字典,字符串
    类型转换:int(x,base);float(x);str(x)

**

(2)位运算

**
知识点:

  1. 原码、反码、补码——二进制的三种表示形式
    计算机内部使用补码来表示。
    原码:其二进制表示,正数用原码表示,负数用补码表示
    反码:正数反码就是原码,负数的反码是原码的符号位不变,原码的其余位取反
    补码:正数的补码就是原码,负数的补码是反码+1
    符号位:即最高位,0表示正,1表示负,位运算中符号位也参与运算

求一个整数的反码和补码时,先把该整数的原码写出来,如果是正数,反码和补码都等于原码;如果是负数,把正数的原码符号位取反,然后按照补反码原则写出来反码和补码。

  1. 异或操作满足交换律和结合律
A: 00 00 11 00
B: 00 00 01 11

A^B: 00 00 10 11
B^A: 00 00 10 11

A^A: 00 00 00 00 # A^A=0
A^0: 00 00 11 00 # A^0=0^A=A

A^B^A: = A^A^B = B = 00 00 01 11
  1. 利用位运算实现快速计算:
    a). 通过<<和>>快速计算2的倍数问题:
    n << 1 -> 计算 n2
    n >> 1 -> 计算 n/2,负奇数的运算不可用
    n << m -> 计算 n
    (2^m),即乘以 2 的 m 次方
    n >> m -> 计算 n/(2^m),即除以 2 的 m 次方
    1 << n -> 2^n
    b). 通过异或(^)快速交换两个整数
    a = a ^ b
    b = b ^ a = b ^ a ^ b = b ^ b ^ a = 0 ^ a = a(这个最后的a是初始的a)
    a = a ^ b = a ^ b ^ b ^ a ^ b = 0 ^ 0 ^ b = b(这个最后的b是初始的b)
    c). 通过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

d). 实现整数集合
一个属的二进制表示可以看作一个集合,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)

练习
leetcode 习题 136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。尝试使用位运算解决此题。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        a = 0
        for i in range (len(nums)):
            a = a ^ nums[i]
        return a

对所有元素做异或运算,两个相同元素做异或得0,一个元素和0做异或为该元素本身,最终结果只剩下只出现一次的元素。
开始想把数组变成二进制形式,但是数组中含有相同元素,这种方法不具有可行性,即元素与集合的操作不可行。于是选择直接对元素进行操作。

总结:
之前对原码,反码,补码的掌握还是不够,对计算机内部存储输出二进制有误解,还是要看下计算机组成原理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值