
Python的一些不熟悉的知识
一些小知识,想到什么写什么
列表与数组
- python中的列表可以包含不同类型的元素,如字符串、整数、浮点数等,而数组通常包含相同类型的元素
- python中列表是动态数组,可以自动调整大小,而数组再创建时需要指定大小,一旦创建后,大小就不能再改变,因此在插入或删除元素时需要手动。
- 数组相当于列表来说在访问元素时性能更好,以为列表是动态数组插入或删除元素可能会有些性能损失。
元组
元组是一个集合是有序的和不可改变的
元组使用小括号(),列表使用方括号[]
元组的创建很简单,只需要在括号中添加元素,使用逗号隔开即可集(Set)
集合是无序和无索引的集合,可以用来快速判断一个元素是否在某个集合中,在py中用{}表示添加一个项目到集合用add()
1
2thiset={"apple","banana","cherry"}
thiset.add("orange")添加多个项目用update()
1
2thiset={"apple","banana","cherry"}
thiset.update(["orange", "mango", "grapes"])删除用Remove()或discard()方法
如果删除的项目不存在,remove()会引发错误,而discard()不会引发错误pop()删除最后一项
clear()清空集合
…
字典
使用values()函数返回字典的值
1
2for x in thisdict.values():
print(x)使用items()循环遍历键和值
1
2for x,y in thisdict.items():
print(x,y)dict()创建字典
1
2
3
4epdict = dict()
print(epdict) # 输出{}
print(len(epdict)) # 输出0
print(type(epdict)) # <class 'dict'>
- 字典的访问
使用中括号[ ]
1
2dic = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
print(dic['key1']) # 输出 value1使用get( )方法
dic.get(key,default=None)它用于从字典中获取指定键key对应的值,键不存在返回一个默认值deafult1
2
3dic = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
print(dic.get('key1')) # 输出value1
print(dic.get('key4')) # 输出 None除以上外,可以通过keys(),values()和items()方法获取字典中所有的键、值和键值对。例如:
1
2
3
4dic = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
print(dic.keys()) # 输出 dict_keys(['key1', 'key2', 'key3'])
print(dic.values()) # 输出 dict_values(['value1', 'value2', 'value3'])
print(dic.items()) # dict_items([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])注意:keys()、values()、items()方法返回的是一种特殊的视图对象,而不是普通的列表。要转换成列表可以用list()函数
频率
看到计算频率等问题直接联想到以下代码:1
2for i in nums:
dic[i] = dic.get(i,0) + 1解包
解包是指将一个序列或元组中的元素分别赋值给变量。可迭代对象是指可以被迭代器遍历的对象,例如列表、元组、字符串等。而解包则是指将一个序列或元组中的元素分别赋值给多个变量的操作。*args
和**kwargs
*args
(arguments)允许你传递零个或多个位置参数给一个函数。它会将传递给函数的位置参数收集到一个元组(tuple)中。在函数定义中,*args
以星号(*)的形式出现,但你可以用任何变量名代替它。
1
2
3
4
5
6
7
8
9
10
11pythonCopy codedef example_function(*args):
for arg in args:
print(arg)
example_function(1, 2, 3, 4, 5)
# Output:
# 1
# 2
# 3
# 4
# 5**kwargs
(keyword arguments)允许你传递零个或多个带有关键字的参数给一个函数。它会将传递给函数的关键字参数收集到一个字典(dict)中,其中关键字作为字典的键,相应的值作为字典的值。在函数定义中,**kwargs
以双星号(**)的形式出现,但你同样可以用任何合法的变量名代替它。
1
2
3
4
5
6
7
8
9pythonCopy codedef example_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
example_function(a=1, b=2, c=3)
# Output:
# a: 1
# b: 2
# c: 3区别总结:
*args
用于接收位置参数,收集为一个元组(tuple)。**kwargs
用于接收关键字参数,收集为一个字典(dict)。- 你可以在同一个函数中同时使用
*args
和**kwargs
,但是*args
必须在**kwargs
之前。 - 参数名
args
和kwargs
只是一种约定,你可以用其他任何合法的变量名替代它们,但通常使用它们是为了提高代码的可读性和清晰度。
取整
使用int取整大于0的数向下取整,小于0的数向上取整匿名函数
lambda函数是个匿名函数,可以使用任意数量的参数,但是只有一个表达式。- 用法
1
2
3
4
5
6lambda arguments:expression
# ep1.返回一个加10的数
x=lambda a:a+10
# ep2.可以使用任意数量的参数:
x=lambda a,b,c:a+b+c
print(x(1,2,3))迭代器
列表、元组、字典都是可迭代的对象,对于这些对象都有一个获取迭代器iter()方法1
2
3
4
5
6mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))创建一个返回数字的迭代器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class MyNumbers:
def __iter__(self):
self.a=1
return self
def __next__(self):
x=self.a
self.a +=1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))Stoplteration关键字
如果有足够的next()语句,为了防止迭代继续进行,可以使用StopIteration语句
ep1迭代20次后停止1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class MyNumbers:
def __iter__(self):
self.a=1
return self
def __next__(self):
if self.a <= 20
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)raise
raise 关键字用于引发异常
ep:如果x<0则引发错误并停止程序
1
2
3x = -1
if x < 0:
raise Excpetion("error")self
在python中,self是一个惯用的参数名称。在定义一个类的方法时,需要将self作为第一个参数传递给方法,当我们定义一个类的方法时,那么在调用该方法时,实际上是通过类的实例对象来调用这个方法,因此不需要显式传递self参数;
如果我们在类的方法中访问类的属性或者方法,那么必须使用self来访问(self.func)。如果我们在方法中直接访问属性或者方法,py会解释为局部变量或函数,从而导致错误。运算符
- // –> 取整数-往小的方向取整数
ep9//2
4 - ** –> 幂 返回x的y次幂
- 逻辑运算符
- 与 and –> x and y
- 或 or –> x or y
- 非 not –> x not y
- // –> 取整数-往小的方向取整数
二维数组初始化
1
2
3
4# 创建一个rows行cols列的二维数组,初始值为0
matrix = [[0 for _ in range(cols)] for _ in range(rows)]
# 创建一个rows行cols列的二维数组,初始值为
matrix = [[0] * cols for _ in range(row)]字符串格式化
例子:1
2
3name = "张三"
age = 18
print("我叫%s,今年%d岁。" % (name, age)) # 输出: "我叫张三,今年18岁。"try
try和except语句来处理异常,try语句块用于包裹可能会引发异常的代码,而except来处理可能引发的异常,除此之外还可以使用else和finally语句块来进一步处理异常。else语句块中的代码会在try语句块中没有发生异常时执行,而finally语句中的代码无论是否发生异常都会执行。1
2
3
4
5
6
7
8try:
x = 10 / 2
except ZeroDivisionError:
print("除数不能为零")
else:
print("结果为:", x)
finally:
print("无论是否发生异常,都会执行这里的代码")except异常由以下几种:
1
2
3
4
5
6
7
8
9
10Exception:所有异常的基类,可以捕获任何类型的异常。
ZeroDivisionError:除以零时引发的异常。
TypeError:类型不匹配时引发的异常。
ValueError:值不合法或无效时引发的异常。
IndexError:索引超出范围时引发的异常。
KeyError:字典中使用不存在的键时引发的异常。
FileNotFoundError:打开或读取文件时找不到文件时引发的异常。
NameError:尝试访问不存在的变量或函数时引发的异常。
ImportError:导入模块失败时引发的异常。
IOError:输入/输出操作失败时引发的异常。推导式
用于快速创建列表、字典、集合等可迭代对象,一般有以下几种:列表推导式
语法形式计为:[expression for item in iterable if condition]或者[expression for item in iterable]
示例:- 过滤长度小于或者等于3的字符串列表,并将剩下的转换成大写字母:
1
2
3
4names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [name.upper()for name in names if len(name)>=3]
print(new_names)
# 输出['ALICE', 'JERRY', 'WENDY', 'SMITH']字典推导式
语法形式为:{key_expr:value for value in collction} 或者 {key_expr:value for value in collction if condition}
示例:- 使用字符串及其长度创建字典
1
2
3
4listdemo = ['Google','Runoob', 'Taobao']
newdic = {key:len(key) for key in listdemo}
newdic
# 输出{'Google': 6, 'Runoob': 6, 'Taobao': 6}集合推导式
语法形式为:{expression for item in Sequence} 或者 {expression for item in Sequence if condition}
示例:- 判断不是abc的字母并输出
1
2
3
4
5a = {x for x in 'abracadabra' if x not in 'abc'}
a
# 输出 {'d','r'}
type(a)
# 输出 <class 'set'>元组推导式(生成器表达式)
可以利用range区间、元组、列表、字典和集合等数据结构类型,快速生成一个满足指定需求的元组,语法形式为:(expression for item in Sequence) 或者 (expression for item in Sequence if condition)元组推导式和列表推导式用法完全相同,只是元组推导式是用()圆括号,列表推导式是用[]中括号,类外元组推导式返回的结果也是一个生成器对象
示例:- 生成一个包含数字1-9的元组:
1
2
3
4
5a= (x for x in range(1,10))
a
# <generator object <genexpr> at 0x7faf6ee20a50> 返回是是生成器对象
tuple(a)
# 转换为元组 (1, 2, 3, 4, 5, 6, 7, 8, 9)
stack下标问题
正数索引(从0开始),列表元素的顺序从左到右。而对于负数索引(从-1开始),元素顺序是从右到左;相当于一个是入栈一个是出栈
py函数
remove()
用于从列表中删除指定元素;语法格式为: list_name.remove(element) #element 任意数据类型删除普通类型元素
删除列表中存在的数字或者字符串;不存在会报错,引发valueError异常1
2
3list1 = ['zhangsan', 'lisi', 1, 2]
list1.remove(1)
list1.remove('lisi')删除对象类型元素
1
2
3
4
5list1=[1,2,[3,4],(5,6)]
a=[3,4]
b=(5,6)
list1.remove(a) # 删除列表类型
list1.remove(b) # 删除元组类型删除多个元素,可以使用循环来实现
1
2
3
4
5
6
7
8# 创建一个列表
fruits = ["apple", "banana", "orange", "peach", "banana", "kiwi"]
# 删除所有的 "banana" 元素
while "banana" in fruits:
fruits.remove("banana")
print(fruits) # ["apple", "orange", "peach", "kiwi"]
注意:在使用 remove() 函数时要谨慎,特别是在迭代列表的过程中,当删除一个元素后会导致后面的元素索引发生变化从而可能导致发生错误
enumerate()
enumerate()是python中的一个内置函数,将一个可迭代对象转换为一个枚举对象,同时返回每个元素的索引和值,常用于for循环中获取中获取每个元素的位置信息。
用法: enumerate(iterable,start=0)
其中,iterable表示要枚举的可迭代对象,start表示起始索引ord()
ord()是一个内置函数,用于获取给定字符的Unicode码点值,ord()函数接受单个字符作为参数;1
ord('a') # 返回97
defaultdict()
defaultdict是python中的一个内置字典子类,重载了一个方法来实现默认值的设定。在创建defaultdict对象,需要提供一个参数作为默认值或者一个函数用来生成默认值。
比如有一个字典对其中的值进行累加操作,如果某个键不存在,则将其值设置为0,使用defaultdict可以避免手动判断键是否存在的过程:1
2
3
4
5
6
7from collections import defaultdict
d = defaultdict(int)
# 对字典中的值进行累加操作
for i in 'mississippi':
d[i]+=1
print(d) # 输出:defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})sorted()
返回一个新的排好序的列表,而不改变原始列表
例如有一个数字列表1
num = [4, 2, 7, 1, 3]
我们可以使用sorted()进行排序、会返回一个新的列表,但是排序后会改变数字原有的索引值
1 | sorted_list = sorted(nums) |
若不想改变原数组的索引值可以用以下方法
1 | # 对nums的元素进行排序,排序的依据是nums中对应的位置,对于nums中的每个元素k,使用nums[k]的值作为排序关键字 |
对于上述第二种方法,enumerate(nums)会返回一个(index,value)的元组.
- list()
list()
是一个空列表的构造函数。当调用list()
时,它会返回一个空列表[]
。这个空列表可以用来存储任意类型的元素,并且可以根据需要进行修改、添加或删除元素。
基本数据结构操作
- python建立二叉树(递归)