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) 型变量只能取两个值,True 和 False。当把布尔型变量用在数字运算中,用 1 和 0 代表 True 和 False。
确定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
'''
练习题:
-
怎样对python中的代码进行注释?
# 单行注释 ''' 多行注释 多行注释 ''' """ 多行注释 多行注释 """ -
python有哪些运算符,这些运算符的优先级是怎样的?

-
python 中
is,is not与==,!=的区别是什么?-
is, is not 对比的是两个变量的内存地址
-
==, != 对比的是两个变量的值
-
当指向地址都是不可变类型时 is,is not 和 ==,!= 是完全等价的
-
-
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 -
按位与操作 & 全
1为1 -
按位或操作 | 有
1为1 -
按位异或操作 ^ 不同为
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
'''
本文深入探讨了Python的基础知识,包括注释、运算符、数据类型及其转换、位运算等核心概念,同时还提供了丰富的示例代码和练习题,帮助读者理解和掌握Python编程的基本技巧。

799

被折叠的 条评论
为什么被折叠?



