【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/132368704 出自【进步*于辰的博客】
相关博文:【python细节、经验】锦集。
注:本文可能不适合 0 python基础的博友,因为对于各类知识点,我阐述的宗旨是“阐明使用细节”,而不是基础知识。
文章目录 1、特殊指令符1.1 `del xx` 2、内置函数3、关于列表(`list`)3.1 切片示例3.2 方法 4、关于元组(`tuple`)5、关于字典(`map`)5.1 概述5.2 方法 6、关于集合(`set`)6.1 概述6.2 方法 7、关于变量7.1 分类7.2 可变参数7.2.1 `*args`格式7.2.2 `**args`格式7.2.3 特殊用法 8、关于`lambda`表达式8.1 特点8.1 用法1:简化函数 9、关于面向对象最后 1、特殊指令符 1.1 del xx 1、del list[索引]# 删除列表元素2、del tuple# 删除整个元组3、del map[key]# 删除字典映射 2、内置函数 摘要参数说明返回值类型/返回值说明list(tuple t)列表将元组转换成列表。注:不修改原元组range(int max)序列最大值序列此方法作用很多,此处的作用是指定一个最大值,返回0 ~ max - 1的序列,常用于遍历filter(a, b)a 是方法,即过滤条件;b 是序列序列过滤序列,需与lambda连用,示例见相关博文第4项 3、关于列表(list)参考笔记二,P25.3~5。
3.1 切片示例 例:list = [1, 2, 3, 4],则list[-3:] = [2, 3, 4]、list[:3] = [1, 2, 3],故:list[-3: 3] = [2, 3]。由于[2, 3] = [2, 3, 4] 并 [1, 2, 3],因此,list[-3: 3] = list[-3:] 并 list[:3];例;list[a: b: x],其中,a 是起始索引,b 是终止索引,x 是步长。若x > 0,则从左往右切片;否则,从右往左切片。注:实际切片内容并不一定是按照[a, b)(即 a → b)或(b, a](即 b → a)规则进行切片。由于a/b/x三者都有“正负”2种情形,因此实际的切片情况很多,我暂且没有找到规律,因此只能按照示例1的“拆分”方法进行分析。 具体方法:
1、将 [a: b: x] 拆分d成 [a: : x] 和 [: b: x];2、计算[a: : x]:a 为起始索引,若x > 0,则向右取所有;否则,向左取所有。得到:[list[a], ...];3、计算[: b: x]:b 为终止索引,同理,得到:[..., list[b]];4、结果:取两者交集. 3.2 方法 摘要参数说明返回值类型/返回值说明append(Object o)追加一个元素extend(List it)追加列表insert(int i, Object o)插入元素pop(int i)返回被删除元素删除元素。若不指定,则删除最后一个元素remove(Object o)移除匹配的第一个元素index(Object o)索引查找匹配的第一个元素。若找不到,则报错reverse()反转列表。相当于list[::-1]count(Object o)int计数sort()排序,默认升序。注:列表所有元素类型必须一致注:
列表元素类型可混搭;切片时,若索引超出范围,不报错。 4、关于元组(tuple)参考笔记二,P33.1。
概述:
元组自创建后无法修改;若元组只有一个元素,则末尾必须添加一个",",否则其类型就不是元组,而是此元素类型;元组无法修改,但基本支持列表拥有的查询系列方法,如:count()、index(),故元组的查询效率高于列表(元组的作用之一)。示例:
t = (2023)print(type(t))t = (2023,)print(type(t))print(t.count(2023))print(t.index(2023))打印结果:
5、关于字典(map)参考笔记二,P33.2。
5.1 概述 添加映射时,若 key 已存在,则覆盖 value;用“{}”表示空字典;访问不存在的 key 时,报错;当为不存在的 key 赋值时,添加此映射;示例:
m = {}print(type(m)) # 打印:<class 'dict'>m = {"name" : 'yuchen',"year" : 2023}# print(m['age']) # 报错:KeyError 5.2 方法1、clear():清空字典,无返回值。
2、copy():复制字典,属“浅复制”。
3、fromkeys(a, b):创建字典。 注:a 是序列,b 是默认值(可不指定)。 示例:
m = {} # 空字典l = [2, 0, 2, 3]m = m.fromkeys(l) # 使用列表构建字典print(m)m = m.fromkeys(l, 0) # 指定所有映射的 value 为 0,即默认值print(m)t = (2023,)m = m.fromkeys(t) # 使用元组构建字典print(m)s = set([2, 0, 2, 3])m = m.fromkeys(s) # 使用集合构建字典print(m)打印结果:
4、get(a, b):获取 value。 注:a 是 key,b 是默认值(当 key 不存在时作为返回值,可不指定)。若 key 不存在,则返回None。
5:keys():返回包含字典所有 key 的“列表”。 注:表面上看是列表,实则不是,用type()即可验证,在某些情况下类似列表。此方法常用于判断字典是否包含某个 key。
6:values():返回包含字典所有 value 的“列表”。
7、items():类似java中的map.entrySet(),常用宇遍历字典。
6、关于集合(set)参考笔记二,P33.3。
6.1 概述 无重复值;定义集合必须使用set()方法;构造有元素集合时,可以使用任意序列;集合不能使用“*”或“连接”;集合常用宇数字意义上的集合操作,如:交集&、并集|、对称差集^,列表则不行。示例:
s = set()print(s)print(type(s))s1 = set((2, 0, 2, 3))print(s1)s2 = set(['c', 's', 'd', 'n'])print(s2)s3 = s1 & s2 # 返回两集合相同元素的集合print(s3)s3 = s1 | s2 # 返回两集合所有元素合集(若有相同元素,仅保留一个)print(s3)s3 = s1 - s2 # 等同于 s1 - (s1 & s2),即:返回s1去除s1与s2相同元素后的集合print(s3)s3 = s1 ^ s2 # 等同于 (s1 - s2) | (s2 - s1)print(s3)打印结果:
6.2 方法 摘要参数说明返回值类型/返回值说明add(Object o)追加元素remove(Object o)移除元素。若元素不存在,报错 7、关于变量参考笔记二,P34.8。
7.1 分类 必须参数:指方法调用时必须指定的参数;(其实就如 java 中的实参,要求个数、类型对应)关键字参数:指方法调用时通过形参名=值的方式指定实参,故可忽略实参顺序;默认参数:指方法定义时已指定默认值的参数,且必须定义在最后;(调用时可不指定)可变参数:指不能在定义方法时确认参数的个数和内容(类型)所使用的参数;组合参数。 7.2 可变参数 7.2.1 *args格式接收“序列”,相当于 java 中的可变参数,args的类型是“元组”。
示例:
def show(*args):for e in args:print(e)# 如 java 中的”xx...“,会将一组数自动封装成数组,在此处是序列show(2023, 'csdn')# java 中的可变参数也可这样定义实参,不过不允许直接这样初始化(也有点多此一举)# 而在此处,尽管 [2023, 'csdn'] 是一个序列,但 args 仅将其视为一个元素,因此无法遍历(直接打印出“[2023, 'csdn']”)show([2023, 'csdn'])# (2023, ), ('csdn',)是两个元组,最后,args 会封装成 ((2023, ), ('csdn',))show((2023, ), ('csdn',))打印结果: 改进:(为调用show([2023, 'csdn'])时,能遍历其内元素)
def show(*args):for e in args:if isinstance(e, list):for i in e:print(i)else:print(e)打印结果:
7.2.2 **args格式表示“字典”(固定),实参必须是关键字参数(也可是字典,但需要使用**标识,往下看)。
示例:
def show(**args):# 因为 args 固定为字典,因此可调用成员方法 items()for k,v in args.items():print(k, v)show(year=2023, flag='csdn')打印结果:
7.2.3 特殊用法(我暂且不知如何描述,看示例)
1、上述*args的示例也可这样改:
l = [2023, 'csdn']show(*l)# 或:show(*range(10))即指明其是一个列表,这样*args就不会将其视为一个元素。
总结:若实参是一组数,如:1, 2, 3,则*args可将其封装成元组;若实参为序列,如:{1, 2, 3}、range(10),则*args会将其视为一个元素或报错(此时就需采用此特殊用法)。
2、**args的实参可使用字典,上述**args的示例可这样改:
m = {'year': 2023,'flag': "csdn"}show(**m)即指明其是一个字典。
注: 若*args与**args连用,也可使用此特殊用法进行指定。不过,顺序不可调换,使用关键字参数也不行。
8、关于lambda表达式参考笔记二,P34.10。
8.1 特点 lambda 语句块只会执行一次,不存在被外部程序反复调用可能;在某些函数必须使用函数作为参数,但是函数本身十分简单且只有一处使用。 8.1 用法1:简化函数示例:
def calculate(x, y):return x + y, x - yt = calculate(10, 20)lambda 改进:
f = lambda x, y: [x + y, x - y]# 相当于方法定义print(type(f))# 打印:<class 'function'>t = f(10, 20)(冒号):左边是参数列表,右边是返回值。
9、关于面向对象参考笔记二,P35.13。
(注:以下阐述都基于类。)
1、构造方法__init__(self)的返回值必须是None,即无返回值,(指无返回值,并不是说需要手动指定return None)
2、所有方法的第1个参数都是self,代指实例,可更名;
3、在所有方法中,由self定义的变量都是成员变量;而直接定义的变量不是成员变量,仅是局部变量,其生命周期仅在函数内,在方法外定义的变量是类变量; 示例:
# 此示例中的3个 name 是3个变量,即3个定义,没有重赋值class Platform:name = 'csdn' # 定义类变量def __init__(self, name):self.name = 'bilibili' # 定义成员变量self.name = name # 为成员变量 name 重赋值# 这不是为类变量/成员变量 name 重赋值,而是定义局部变量# 因此在此示例中,在类外无法访问name = '博客园'print(Platform.name) # 访问类变量,打印:csdn# 实例化。实例化时,由于仅定义了一个带有一个参数的构造方法,因此需要指定一个实参p1 = Platform("开源中国")print(p1.name) # 访问成员变量,打印:开源中国4、在变量前加__(双下划线)表示私有变量。在 java 中,私有成员变量的作用域为当前类,而 python 中私有实例变量(即成员变量)的作用域为所有方法(因为第2点); 示例:
class Platform:def __init__(self, name):self.__name = namedef getName(self):return self.__namep1 = Platform('csdn')print(p1.getName()) # 打印:csdn5、在方法前加__表示私有方法,私有方法只能在类内部调用,实例不能直接调用;(此性质与 java 相同) 示例:
class Platform:def __init__(self, name):self.__name = namedef __getName(self):return self.__namedef toString(self):print('name = ' + self.__getName())p1 = Platform('csdn')p1.toString() # 打印:name = csdn 最后本文中的举例是为了方便大家理解、以及阐述相关知识点而简单举出的,不一定有实用性,也不一定有针对性,比如:集合运算&,目的是获取两集合相同元素,而第6.1项的示例中我没有刻意去定义s1、s2包含了相同元素。我之所以如此:
这些细节很简单,大家在其他编程语言或课程、书本或资料上肯定或多或少接触过或完全知道,因此没必要特意举例;本文阐述的宗旨是“阐明使用细节”,而对于其他附属知识并不一定会细致说明。因此,一些细节需要大家自行测试或查找资料。
本文持续更新中。。。