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"(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。
  • 布尔型:布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如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 notis比较的是数据的内存地址,==!=比较的数据本身。
  • 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

你可能感兴趣的:(python,补码,字符串)