python 变量运算符数据结构

本文深入探讨了Python的基础知识,包括注释、运算符、数据类型及其转换、位运算等核心概念,同时还提供了丰富的示例代码和练习题,帮助读者理解和掌握Python编程的基本技巧。

python 基础学习一

记录学习 全部参考 https://github.com/datawhalechina/team-learning-program

注释

  • #:单行注释
  • ''' ''' 或者 """ """ :多行注释

运算符

算数运算符

加(+)减(-)乘(*)除(/) 整除(//) 取余(%) 幂(**)

比较运算符

大于(>) 小于(<) 等于(==) 不等于(!=) 大于等于(>=) 小于等于(<=)

逻辑运算符

与(and) 或(or) 非(not)

位运算符

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

三元运算符

res = c if a > b else d
# 若 a>b(true)  res = c
# 若 a>b(false) res = d

三目运算符的嵌套

Python 三目运算符支持嵌套,如此可以构成更加复杂的表达式。在嵌套时需要注意 if 和 else 的配对

a, b, c, d = 1, 2, 3, 4
res = a if a>b else c if c>d else d       # res = 4
res = a if a>b else ( c if c>d else d )   # res = 4

其他运算符

in 存在 'A' in ['A', 'B', 'C']

not in 不存在 'h' not in ['A', 'B', 'C']

is"hello" is "hello"

is not 不是 "hello" is not "hello"

:

  • is, is not 对比的是两个变量的内存地址

  • ==, != 对比的是两个变量的

  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。

  • 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。

# 两个变量均指向不可变类型
a = "hello"
b = "hello"
print(a is b, a == b)  # True True
print(a is not b, a != b)  # False False

# 比较的两个变量均指向可变类型
a = ["hello"]
b = ["hello"]
print(a is b, a == b)  # False True
print(a is not b, a != b)  # True False

运算符的优先级

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

数据类型与转换

简单数据类型

  • 整型<class 'int'>
  • 浮点型<class 'float'>
  • 布尔型<class 'bool'>

容器数据类型

  • 列表<class 'list'>
  • 元组<class 'tuple'>
  • 字典<class 'dict'>
  • 集合<class 'set'>
  • 字符串<class 'str'>

整型

a = 1031
print(a, type(a))
# 1031 <class 'int'>

浮点型

print(1., type(1.))
# 1.0 <class 'float'>
a = 0.00000023
b = 2.3e-7
print(a)  # 2.3e-07
print(b)  # 2.3e-07

保留浮点型的小数点后 n

decimal 包里的 Decimal 对象和 getcontext() 方法来实现:

import decimal
from decimal import Decimal

a = decimal.getcontext()   # Decimal 对象的默认精度值是 28 位 (`prec=28`)
print(a)

# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
# capitals=1, clamp=0, flags=[], 
# traps=[InvalidOperation, DivisionByZero, Overflow])

# 使 1/3 保留 4 位,用 getcontext().prec 来调整精度
b = Decimal(1) / Decimal(3)
print(b)		# 0.3333333333333333333333333333

decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)        # 0.3333

布尔型

布尔 (boolean) 型变量只能取两个值,TrueFalse。当把布尔型变量用在数字运算中,用 10 代表 TrueFalse

确定bool(X) 的值是 True 还是 False,就看 X 是不是空,空的话就是 False,不空的话就是 True

  • 对于数值变量,0, 0.0 都可认为是空的。
  • 对于容器变量,里面没元素就是空的。
print(type(0), bool(0), bool(1))	# <class 'int'> False True
print(type(10.31), bool(0.00), bool(10.31))  # <class 'float'> False True
print(type(True), bool(False), bool(True))   # <class 'bool'> False True

# bool作用在容器类型变量:X 只要不是空的变量,bool(X) 就是 True,其余就是 False
print(type(''), bool(''), bool('python'))    # <class 'str'> False True
print(type(()), bool(()), bool((10,)))       # <class 'tuple'> False True
print(type([]), bool([]), bool([1, 2]))      # <class 'list'> False True
print(type(set()), bool(set()), bool({1, 2})) # <class 'set'> False True
print(type({}), bool({}), bool({'a': 1, 'b': 2})) # <class 'dict'> False True

获取类型信息

  • 获取类型信息 type(object), type() 不会认为子类是一种父类类型,不考虑继承关系。
  • 获取类型信息 isinstance(object, classinfo) ,isinstance() 会认为子类是一种父类类型,考虑继承关系.

如果要判断两个类型是否相同推荐使用 isinstance()

print(type(1))  # <class 'int'>
print(type(5.2))  # <class 'float'>
print(type(True))  # <class 'bool'>
print(type('5.2'))  # <class 'str'>

print(isinstance(1, int))  # True
print(isinstance(5.2, float))  # True
print(isinstance(True, bool))  # True
print(isinstance('5.2', str))  # True

类型转换

  • 转换为整型 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

print() 函数

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  • 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
  • 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
  • 关键字参数end是输出结束时的字符,默认是换行符\n
  • 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
  • 关键字参数flush是立即把内容输出到流文件,不作缓存。
citylist = ['Shanghai', 'Beijing', 'Chengdu', 'Wuhan']
print("This is printed without 'end'and 'sep'.")
for item in citylist:
    print(item)
    
'''
This is printed without 'end'and 'sep'.
Shanghai
Beijing
Chengdu
Wuhan
'''
citylist = ['Shanghai', 'Beijing', 'Chengdu', 'Wuhan']
print("This is printed with 'end='&''.")
for item in citylist:
    print(item,end='&')

'''
This is printed with 'end='&''.
Shanghai&Beijing&Chengdu&Wuhan&
'''
citylist = ['Shanghai', 'Beijing', 'Chengdu', 'Wuhan']
print("This is printed with 'sep='--''.")
for item in citylist:
    print("welcome",item,sep='--')
    
'''
This is printed with 'sep='--''.
welcome--Shanghai
welcome--Beijing
welcome--Chengdu
welcome--Wuhan
'''

练习题

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

    # 单行注释
    '''
    多行注释
    多行注释
    '''
    """
    多行注释
    多行注释
    """
    
  2. python有哪些运算符,这些运算符的优先级是怎样的?

    在这里插入图片描述

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

    • is, is not 对比的是两个变量的内存地址

    • ==, != 对比的是两个变量的

    • 当指向地址都是不可变类型时 is,is not 和 ==,!= 是完全等价的

  4. python有哪些运算符,这些运算符的优先级是怎样的?这些数据类型之间如何转换?

   6个标准数据类型
                   *Number(数字)
                       *True=1
                       *False=0
                       *数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符
                       *在混合计算时,python会把整形转换为浮点数
                   *String(字符串)
                       *字符串用'或"括起来,同时使用\转义特殊字符串
                       *如果不想让反斜杠发生转义,可以在字符串前面加个r表示原始字符串
                       *索引值以0为开始,-1为末尾的开始位置
                       *加号+是字符串的连接符,星号*表示复制当前的字符串,紧跟的数字为复制的次数
                   *List(列表)
                       *list写在方括号之间,元素用逗号隔开
                       *和字符串一样,list可以被索引和切片
                       *list可以使用+操作符进行连接
                       *list中的元素可以改变的
                   *Tuple(元组)
                       *元组与列表类似,不同之处在于元组的元素不能修改,元组写在小括号里。元素之间用逗号隔开
                       *元组也可以被索引和切片,方法一样
                       *注意构造包含0或1个元素的元组的特殊语法规则
                       *元组也可以用+操作符进行拼接
                   *Sets(集合)
                       *set是一个无需不重复的序列,基本功能是进行成员关系的测试和删除重复元素
                   Dictionary(字典)
                       *字典是一种映射类型,字典用{}标识,它是一个无序的建(key):值(value)对集合
                       *建(key)必须使用不可变类型。在同一个字典中建(key)必须是唯一的
                       *创建空字典使用{}
    *int(x,base=10)x字符串或数字,base进制数,默认十进制 浮点转为整数
    *float 整数转换为浮点型
    *complex(1,2) 转换为复数
    *str(10)将对象转换为字符串
    *repe()将对象转换为表达式字符串
    *repr(dict)将对象转换为表达式字符串
    *eval(str)用来计算在字符串中有效的python表达式,返回一个对象
    *tuple(listi)将列表转化为元组
    *list()将元组转换为列表
    *set转换集合

位运算

原码:就是其二进制表示(注意,有一位符号位)。

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

补码:正数的补码就是原码,负数的补码是反码+1。

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

  • 按位非操作 ~ ~ 1 = 0 ~ 0 = 1

  • 按位与操作 & 全 11

  • 按位或操作 | 有11

  • 按位异或操作 ^ 不同为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 = 5       # 0000 0101
b = -5      # 1111 1011
a ^= b      # 1111 1110
b ^= a      # 0000 0101    5
a ^= b      # 1111 1011    -5

通过 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

利用位运算实现整数集合

一个数的二进制表示可以看作是一个集合(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)

Python 的bin() 输出。

print(bin(3))  # 0b11
print(bin(-3))  # -0b11

print(bin(-3 & 0xffffffff))  
# 0b11111111111111111111111111111101

print(bin(0xfffffffd))       
# 0b11111111111111111111111111111101

print(0xfffffffd)  # 4294967293
  • Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号**,巨坑**。
  • Python中的整型是补码形式存储的。
  • Python中整型是不限制长度的不会超范围溢出。

所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff进行按位与操作,再交给bin()进行输出,得到的才是负数的补码表示。

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

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

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

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for num in nums:
            res^=num
        return res
'''
一个整数与自己异或的结果是0
一个整数与0异或的结果是自己
异或操作满足交换律,即 a^b^c^d^a^b^d == a^a^b^b^d^d^c == c
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值