变量、运算符、数据类型及位运算

笔记

注释

单行注释(#)
多行注释(’’’ ‘’'或""" “”")

运算符

算数运算符

**(幂)
%(取余),//(整除),*, /
+, -

比较运算符

==, !=(不等于), >, >=, <, <=

逻辑运算符

not
and, or

位运算符

~(按位取反),&(按位与),|(按位或)
^(按位异或),<<(左移),>>(右移)

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

三元运算符

exp1 if condition else exp2

其他运算符

is , is not
in , not in

is, is not 对比的是两个变量的内存地址
==, != 对比的是两个变量的值

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

运算符的优先级

1.一元运算符优于二元运算符。如正负号
2. 先算术运算,后移位运算,最后位运算
3. 逻辑运算最后结合

变量和赋值

使用变量之前,对其先赋值
变量名可以包括字母、数字、下划线、但变量名不能以数字开头
大小写敏感

数据类型和转换

  1. 基本类型:整型、浮点型、布尔型
  2. 容器类型:字符、元组、列表、字典和集合

print(type(a)):可得到a的类(class)
print(dir(b)):可得到类型的属性和方法
print(bin(a)):可得到a的二进制表示
print(a.bit_length()):可得到a的二进制长度

decimal 包里的 Decimal 对象和 getcontext() 来实现保留浮点型的小数点后 n 位
引进package:
import decimal
from decimal import Decimal

补:导入模块

  1. import 语句
    import 模块名称1,2,
    函数调用时,必须在函数名称之前先加上模块名.
  2. from import 语句
    from 模块名称 import *
    调用 模块中的函数时不需要模块名称.前缀

确定 bool(X) 的值是 True 还是 False

  1. bool 作用在基本类型变量: X 只要不是整型 0 、浮点型 0.0 , bool(X) 就是 True ,其余就是False
  2. bool 作用在容器类型变量: X 只要不是空的变量, bool(X) 就是 True ,其余就是 False

获取类型信息

  1. type(object)
  2. isinstance(object, classinfo)

type() 不会认为子类是一种父类类型,不考虑继承关系
isinstance() 会认为子类是一种父类类型,考虑继承关系
如果要判断两个类型是否相同推荐使用 isinstance()

类型转换

  1. 转换为整型 int(x, base=10)
  2. 转换为字符串 str(object=’’)
  3. 转换为浮点型 float(x)

print()函数

默认:
print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)

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

位运算

原码,反码和补码

二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示
原码:就是其二进制表示(注意,有一位符号位)
反码:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)
补码:正数的补码就是原码,负数的补码是反码+1
符号位:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算

利用位运算实现快速计算
  1. 通过 << , >> 快速计算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

  2. 通过 ^ 快速交换两个整数
    a ^= b
    b ^= a
    a ^= b

  3. 通过 a & (-a) 快速获取 a 的最后为 1 位置的整数。

  4. 利用位运算实现整数集合
    一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)
    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中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号
  2. Python中的整型是补码形式存储的
  3. Python中整型是不限制长度的不会超范围溢出

解决:
所以为了获得负数(十进制表示)的补码,

  1. 需要手动将其和十六进制数 0xffffffff 进行按位与操作
  2. 再交给 bin() 进行输出

得到的才是负数的补码表示

答疑

1

b = Decimal(1) / Decimal(3)
c = Decimal(1 / 3)
print(b, c)
b=0.3333333333333333333333333333,精度为28位;
c=0.333333333333333314829616256247390992939472198486328125 ,精度为54位。
既然 Decimal 对象的默认精度值是 28 位 ,那为什么Decimal(1 / 3)的精度不是28位呢?
Decimal对象的精度与舍入操作仅参与算数运算实现,对于Decimal(1/3)返回的是Decimal(1/3)的准确表示,一般为53位及以上.

2

对于位运算中,通过 a & (-a) 快速获取a的最后为 1 位置的整数。整数在内存中是按补码形式存在的,输出也应该按照补码形式。
例:
4->00 00 01 00

-4->11 11 11 00

4&(-4)->00 00 01 00 -> 4

3

《利用位运算实现整数集合》中“比如集合{1,3,4,8}可以表示成 01 00 01 10 10”这句怎么推得?
一个无符号整数能够表达一个集合
用 uint[] 的数组来表达。 比如最大位是60,用两个无符号整数表示。uint 是32位的 能够表达 0~31 这样表示集合 可以节省内存。而且利用位运算可以进行集合的交集,并集,差集等运算。
{1,3,4,8}表示这些位置上是在集合中,然后对一个uint的32确定1,3,4,8这些二进制位置上是1然后转成对应的十进制作为uint值保存。

例:
01 00 01 10 10
98 76 54 32 10

作业

1

  1. 在 Python 中, # 表示注释,作用于整行;
    ‘’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内容被注释
  2. 1)
    算数运算符
    **(幂)
    %(取余),//(整除),*, /
    +, -
    比较运算符
    ==, !=(不等于), >, >=, <, <=
    逻辑运算符
    not
    and, or
    位运算符
    ~(按位取反),&(按位与),|(按位或)
    ^(按位异或),<<(左移),>>(右移)
    三元运算符
    exp1 if condition else exp2
    其他运算符
    is , is not
    in , not in
    2)
    优先级:
    一元运算符优于二元运算符。如正负号
    先算术运算,后移位运算,最后位运算
    逻辑运算最后结合
  3. is, is not 对比的是两个变量的内存地址
    ==, != 对比的是两个变量的值
    假如比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的
    假如对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的
  4. 1)
    基本类型:整型、浮点型、布尔型
    容器类型:字符、元组、列表、字典和集合
    2)
    1.转换为整型 int(x, base=10)
    2.转换为字符串 str(object=’’)
    3.转换为浮点型 float(x)
    补:
    如想输入得到一个列表:
    a=list(map(int,input().split()))
    map()函数
    有时需要对列表中每个元素做一个相同的处理,得到新列表
    例如:所有数据乘以3
    所有字符串转换为整数
    两个列表对应值相加
    map(func, list1, list…)
    函数func有几个参数,后面跟几个列表

2

class Solution:
    def __init__(self,nums):
        self.fnums=nums
    def singleNumber(self):
        result=0;
        for i in self.fnums:
            result^=i
        return result
example1=Solution([2,2,1])
result1=example1.singleNumber()
example2=Solution([4,1,2,1,2])
result2=example2.singleNumber()
print("非空整数数组",example1.fnums,"除了某个元素只出现一次以外,其余每个元素均出现两次")
print("那个只出现了一次的元素是",result1)
print("非空整数数组",example2.fnums,"除了某个元素只出现一次以外,其余每个元素均出现两次")
print("那个只出现了一次的元素是",result2)  

结果:

>>> 
=============== RESTART: D:/BaiduNetdiskDownload/python3/练习.py ===============
非空整数数组 [2, 2, 1] 除了某个元素只出现一次以外,其余每个元素均出现两次
那个只出现了一次的元素是 1
非空整数数组 [4, 1, 2, 1, 2] 除了某个元素只出现一次以外,其余每个元素均出现两次
那个只出现了一次的元素是 4
>>> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值