DataWhale_python训练营task1
一. Task01: 变量、运算符、数据类型及位运算(2天)
理论部分
- 了解python中基本的变量类型,运算符,及数据类型。
- 了解python的位运算
练习部分
- 课后思考题
- leetcode练习题
1.注释
# 单行注释
'''
多行注释
'''
2.变量
变量类型
- 整型:Python中可以处理任意大小的整数(Python 3.x中整数只有int这一种了),而且支持二进制(如
0b100
,换算成十进制是4)、八进制(如0o100
,换算成十进制是64)、十进制(100
)和十六进制(0x100
,换算成十进制是256)的表示法。 - 浮点型:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如
123.456
)之外还支持科学计数法(如1.23456e2
)。 - 字符串型:字符串是以单引号或双引号括起来的任意文本,比如
'hello'
和"hello"
(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。 - 布尔型:布尔值只有
True
、False
两种值,要么是True
,要么是False
,在Python中,可以直接用True
、False
表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如3 < 5
会产生布尔值True
,而2 == 1
会产生布尔值False
)。 - 复数型:形如
3+5j
,跟数学上的复数表示一样,唯一不同的是虚部的i
换成了j
。实际上,这个类型并不常用,大家了解一下就可以了。
变量命名
硬性规则:
- 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。
- 大小写敏感(大写的
a
和小写的A
是两个不同的变量)。 - 不要跟关键字(有特殊含义的单词,后面会讲到)和系统保留字(如函数、模块等的名字)冲突
PEP 8要求:
- 用小写字母拼写,多个单词用下划线连接。
- 受保护的实例属性用单个下划线开头。
- 私有的实例属性用两个下划线开头。
变量类型转换
-
使用
int()
,float()
,str()
,chr()
,ord()
进行类型转换 -
bool(X)
X为数据类型时,只要值不为0,则为True。X为容器类型:集合、元组、列表、字典时,只要不为空,则为True -
利用
type()
和isinstance(object, class)
来判断变量类型,isinstance更佳,因为承认父类继承关系
3.运算符
运算符 | 描述 |
---|---|
[] [:]
|
下标,切片 |
** |
指数 |
~ + -
|
按位取反, 正负号 |
* / % //
|
乘,除,模,整除 |
+ -
|
加,减 |
>> <<
|
右移,左移 |
& |
按位与 |
^ |
|
按位异或,按位或 |
<= < > >=
|
小于等于,小于,大于,大于等于 |
== !=
|
等于,不等于 |
is is not
|
身份运算符 |
in not in
|
成员运算符 |
not or and
|
逻辑运算符 |
= += -= *= /= %= //= **= &= |= ^= >>= <<=
|
(复合)赋值运算符 |
注意:
1.is
is not
代表对比的是两个变量的内存地址, ==
, !=
对比的是两个变量的值。
容器类型地址可变,数据类型地址不变,故使用 ==
, !=
更佳。
2.特殊三元运算符:
small = x if x < y else y
3.一元运算符优于二元运算符,如正负号。
先算术运算,后移位运算,最后位运算。
逻辑运算最后结合。
4.位运算
原码、反码和补码
计算机中按照补码保存数据。
正数 | 负数 | |
---|---|---|
原码 | 符号位正为0 | 负为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
- 通过 ^ 快速交换两个整数。
a ^= b
b ^= a
a ^= b
原理:
假定下边等式中的等号右侧的a和b为初始固定值。由于多个数进行异或运算的值只与1的个数有关,1的个数为奇数则结果为1,1个数为偶则结果为0。b = b ^ a ^ b
b^b
每一位的1个数都为偶数,故结果只取决于a
, 即最终达到 b = a
。
下边再看第三行代码,a = a ^ b
, 此时的a
为初始的a ^ b
,而此时的b
为初始的a
,同理最终实现将b
的初始值赋给a
,从而实现值的交换。
- 通过 a & (-a) 快速获取 a 的最后为 1 位置的整数。
原理:a和-a为一正一负,假定a为正,-a为负(反之结果相同),故a为原码,-a为a原码取反加一,两者相与的话结果几乎全为0,只有加一的地方会不同。观察最后为1位置,取反加一后此处也为1,故与后该位仍为1,故最终结果为 a 的最后为 1 位置的整数。
利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 {1, 3, 4, 8} 可以表示成 01 01 10 00 10 而对应的位运算也就可以看作是对集合进行的操作。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
集合与元素的操作
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)
练习题1
- 怎样对python中的代码进行注释?
使用#+空格号进行单行注释。 - python有哪些运算符,这些运算符的优先级是怎样的?
包含算术运算符,逻辑运算符,比较运算符、位运算符和其他运算符。
优先级:
一元运算符 > 二元运算符
算术运算符 > 移位运算 > 位运算
逻辑运算最后进行 - python 中 is ,
is not
与==
,!=
的区别是什么?is not
和is
比较的是数据的内存地址,==
和!=
比较的数据本身。 - python 中包含哪些数据类型?这些数据类型之间如何转换?
整型、浮点型、字符串型、布尔型、复数型。
使用int()
,float()
,str()
,chr()
,ord()
进行类型转换。
练习题2
- 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。尝试使用位运算解决此题。
思路:利用异或运算的特性,任何数与本身相异或为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: List[int]) -> int:
a = 0
for num in nums:
a ^= num
return a
- 解题过程中的教训:
a.不要钻牛角尖
b.a^num
并不会改变a的值,记得写等号a^=num
!
本文地址:https://blog.csdn.net/qq_29380039/article/details/107442059