python基础task1-变量、运算符、数据类型及位运算

练习题

  1. 怎样对python中的代码进行注释?
  2. python有哪些运算符,这些运算符的优先级是怎样的?
  3. python 中 is, is not 与 ==, != 的区别是什么?
  4. python 中包含哪些数据类型?这些数据类型之间如何转换?

1. 怎样对python中的代码进行注释?

  • 在python中,# 表示单行注释,
  • ‘’’’’'或者""""""用于区间注释

2. python有哪些运算符,这些运算符的优先级是怎样的?

算术运算符、比较运算符、逻辑运算符、位运算符、三元运算符
优先级:

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

3. python 中 is, is not 与 ==, != 的区别是什么?

区别:

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

【例子】比较的两个变量均指向不可变类型。

a = "hello"
b = "hello"
print(a==b, a is b)
True True

【例子】比较的两个变量均指向可变类型。

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

4. python 中包含哪些数据类型?这些数据类型之间如何转换?

数据类型:

  • int 整型 <class ‘int’> -876, 10

  • float 浮点型<class ‘float’> 3.149, 11.11

  • bool 布尔型<class ‘bool’> True, False

类型转换:

  • 转换为整型 int(x, base=10)

  • 转换为字符串 str(object=’’)

  • 转换为浮点型 float(x)

print(int('520'))  # 520
print(int(520.52))  # 520
print(float('520.52'))  # 520.52
print(float(520))  # 520.0
print(str(10 + 10))  # 20
print(str(10.1 + 5.2))  # 15.3
520
520
520.52
520.0
20
15.3

1. 原码、反码和补码

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

原码:就是其二进制表示(注意,最高位是符号位)

00 00 00 11 —>3

10 00 00 11 ->-3

反码 :正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)

00 00 00 11 -> 3
11 11 11 00 -> -3

符号位 :最高位为符号位,0表示正数,1表示负数,再位运算中符号位也参与运算。

2. 按位非操作 ~

~1 = 0

~0 = 1
把num的补码中的0和1全部取反,有符号整数的符号位在~运算中同样会取反

00 00 01 01 ->5

~

11 11 10 10 ->-6

3. 按位与 &

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

1 & 1
1
1 & 0
0
0 & 1
0
0 & 0
0

4.按位或 |

有1为1,无1为0

print(1 | 1)
print(1 | 0)
print(0 | 1)
print(0 | 0)
1
1
1
0

5.按位异或 ^

相同为0,不同为1

  • a^0 = a 任意数a和0做异或,结果仍为a本身
  • a^a = 0 任意数和自身做异或,结果为数字本身
print(1^1,
     1^0,
     0^1,
     0^0)
0 1 1 0

6. 按位左移操作 <<

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

相当于num = num*2^i

# 00 00 10 11 -> 11
11 << 3
# 01 01 10 00 -> 88
88

按位右移

num >> i

相当于num = num /(2^i)

11 >> 2
2
7 >> 2
1

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

通过<<, >> 快速计算2的倍数问题:

  • n << 1 -> 计算n*2
  • n >> 1 -> 计算n/2,负数的计算不可用
  • 1 << n -> 2^n

通过^快速交换两个整数

a ^= b

b ^= a

a ^= b

9. 利用位运算实现整数集合

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

比如集合{1, 3, 4, 8},可以表示成01 00 01 10

练习题:

leetcode 习题 136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

尝试使用位运算解决此题。

解题思路: 使用异或操作:

  • a^0 = a 任意数和0做异或,结果为数字本身
  • a^a = 0 任意数和自身做异或,结果为数字本身

根据这个规律,将数组里的数字全部做异或,出现两次的元素异或结果为0,异或后的结果就是那个只出现了一次的元素。

"""
Input file
example1: [2,2,1]
example2: [4,1,2,1,2]

Output file
result1: 1
result2: 4
"""

class Solution:
    def singleNumber(self, nums):
        res = 0
        for i in nums:
            res = res^i 
        return res

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值