Python学习笔记(一)--数据类型、复制、函数
第一部分 容器类数据类型
容器类的数据类型:列表、元组、集合、字典。
1列表--list
1.1 创建
list1 = [] ---空列表的定义
list2 = ['A','B','C']---有内容的列表
1.2 类别特点
a.没有长度限制;
b.可以存放任意类型;
c.列表中允许存放重复元素。
1.3 内容的访问
从列表中获取内容
单个元素通过下标或者索引获取,下标从0开始,到len(list对象)-1结束。;
列表支持切片,返回值为新列表;
list[start:end:step] ---从start到end-1,每次的步长为step;逆序,step 必须是负数;
list[start:] ---从start到结尾;
list[:end] ---从0到end-1;
list[start:end] ---从start到end-1
1.4 内置函数
1.4.1 增加
append() ----列表的末尾追加
insert(index,object)---将对象插入到index位置(插队)。插队现象;位置即下标位置,值代表元素。会导致后面元素的移动。
extend(iterable)--将一个可迭代对象添加到列表中(可以实现一次添加多个元素);
1.4.2 删除
remove()----移除列表中第一次出现的指定值;无返回值;如果要删除的值在列表中不存在,则报错;
pop(index)---根据位置index删除元素;如果没有index这个参数的话,表示删除列表的最后一个元素;
del 列表[下标]---内置关键字;内存当中,删除指定列表中的元素;
del 类别 --不带下标,内存当中,删除整个列表;既清空内容也删除地址;
clear()---清空内容,地址保留。
1.4.3 查找
index(参数)----返回元素所在位置;参数是要查找的对象,返回的是对象的位置,如果没有则报错。
1.4.4 更新
更改没有对应的方法,直接更新
即列表[位置] = 新值 ---新值替换该位置的旧值;
1.4.5 排序 --sorted()
对列表进行排序可以使用内置的sorted()
函数或者列表的sort()
方法。
sorted()
函数会返回一个新的排序后的列表,不会改变原列表。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
如果需要对包含字符串的列表进行排序,可以使用key
参数指定排序规则,例如按照字符串的长度排序:
words = ['apple', 'banana', 'cherry', 'date'] sorted_words = sorted(words, key=len) print(sorted_words) # 输出: ['date', 'apple', 'cherry', 'banana']
对于复杂的对象,可以使用lambda
函数定义排序规则:
people = [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 35}] sorted_people = sorted(people, key=lambda person: person['age']) print(sorted_people) # 输出: [{'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 35}]
1.4.6 其它函数
join(iterable)---把可迭代的合并成一个字符串;
copy()---list完成是一个浅copy;浅拷贝---执行copy()操作,返回一个新的地址(存放的内容同原来的内容--内容为a.字符串、整型 -->两个列表使用的是同一个地址;b.或者为列表--内层的列表也是一个单独的空间(有自己的地址),原列表与复制生成的列表使用的都是同一个地址;)
len()---列表元素的个数;
count(参数)---列表中指定值的个数;
1.5 可支持的符号
+ ---->类似于list1.extend(list2);
* --->类似字符串*使用;
[] -->切片
in --->支持in,表示判断元素是否在列表中;
is --->列表地址的比较
1.6 运算相关的系统内置函数
sum() ---->求和
min()---->求最小值
max()---->求最大值
cmp(list1,list2) -->比较,新版本已移除。
1.7 列表表达式(List Comprehensions)
它是一个定义和创建列表的强大工具,通常可以在一行代码中完成。
语法
[expression for item in iterable if condition]
记住--要有[] 括起来
- expression 是对 item 进行操作的表达式。
- for item in iterable 是遍历可迭代对象(如列表、元组、字符串等)的循环。
- if condition(可选)是过滤条件,只有满足条件的项才会被添加到新列表。
示例 --生成两个列表元素组合的所有配对。
pairs = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y] print(pairs) # 输出: [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
2.元组【tuple】
2.1 元组的特点
a.元组也是一种容器,可以存放多个元素;
b.类似于列表,但不支持删除、添加、修改。
2.2 元组声明
tuple1=() ---声明一个元组;
tuple2=(a,b,c,d) --声明一个非空元组,如果只有一个元素,一定要在元素后面加个逗号【,】才是元组;
tulpe3=tuple() --相当于tuple=()。
2.3 元素获取
元组支持下标和切片
tuple2[下标值]
tuple2[:] ---包前不包后
2.4 元组的内置函数
不支持 添加(append或insert)、删除(pop)、修改,只能借助于list与tuple之间的转换才能完成。
支持:
查找--index();--判断元素是否在元组中,不存在保存;存在,返回第一次出现的位置。
个数统计--count();---返回指定元素的个数;
可以使用sorted()系统函数排序,但是返回的结果是一个列表。
2.5 类型的转换
列表-->元组:tuple(list) 等到的是元组类型;
元组-->列表:list(tuple) 得到的是列表类型。
2.6 元组可以支持的符号
+ --->元组相加
* ---->元组倍数扩展
in --->判断是否在元组中;没有返回False,有则返回True。
is --->判断地址
2.7 元组在pymysql中的运用
比如,我们常常从mysql数据库中获取数据,cursor.fetchall() 返回类型,默认的就是元组。
举例说明:查询EMPLOYEE表中salary(工资)字段大于1000的所有数据:
#!/usr/bin/python3 import pymysql # 打开数据库连接 db = pymysql.connect(host='localhost', user='testuser', password='test123', database='TESTDB') # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 查询语句 sql = "SELECT * FROM EMPLOYEE \ WHERE INCOME > %s" % (1000) try: # 执行SQL语句 rowscount = cursor.execute(sql)
print(rowscount) ###放回结果的条数 # 获取所有记录,默认 返回类型是 元组 results = cursor.fetchall() for row in results: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印结果 print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ (fname, lname, age, sex, income )) except: print ("Error: unable to fetch data") # 关闭数据库连接 db.close()
3.集合
3.1 特点
无序(存放的顺序和打印的顺序可能是不一样的),不重复(在集合中不会出现重复的元素)。
底层原理是哈希表,哈希表无序、不重复。
3.2 内建方法
方法 | 描述 |
---|---|
add() | 向集合添加元素。 |
clear() | 删除集合中的所有元素。 |
copy() | 返回集合的副本。 |
difference() | 返回包含两个或更多集合之间差异的集合。 |
difference_update() | 删除此集合中也包含在另一个指定集合中的项目。 |
discard() | 删除指定项目。 |
intersection() | 返回为两个其他集合的交集的集合。 |
intersection_update() | 删除此集合中不存在于其他指定集合中的项目。 |
isdisjoint() | 返回两个集合是否有交集。 |
issubset() | 返回另一个集合是否包含此集合。 |
issuperset() | 返回此集合是否包含另一个集合。 |
pop() | 从集合中删除一个元素。 |
remove() | 删除指定元素。 |
symmetric_difference() | 返回具有两组集合的对称差集的集合。 |
symmetric_difference_update() | 插入此集合和另一个集合的对称差集。 |
union() | 返回包含集合并集的集合。 |
update() | 用此集合和其他集合的并集来更新集合。 |
3.3 常用方法
3.3.1 访问
无法通过引用索引来访问 set 中的项目,因为 set 是无序的,项目没有索引。
但是您可以使用 for
循环遍历 set 项目,或者使用 in
关键字查询集合中是否存在指定值。
thisset = {"apple", "banana", "cherry"} for x in thisset: print(x)
3.3.2 增删改
修改
集合一旦创建,您就无法更改项目,但是您可以添加新项目。
添加项目
要将一个项添加到集合,请使用 add()
方法。
要向集合中添加多个项目,请使用 update()
方法。
使用 add()
方法向 set 添加项目:
thisset = {"apple", "banana", "cherry"} thisset.add("orange") print(thisset)
使用 update()
方法将多个项添加到集合中:
thisset = {"apple", "banana", "cherry"} thisset.update(["orange", "mango", "grapes"]) print(thisset)
3.3.3删除项目
要删除集合中的项目,请使用 remove()
或 discard()
方法。
使用 remove()
方法来删除 “banana”:
thisset = {"apple", "banana", "cherry"} thisset.remove("banana") print(thisset)
注释:如果要删除的项目不存在,则 remove()
将引发错误。
注释:如果要删除的项目不存在,则 discard()
不会引发错误。
您还可以使用 pop()
方法删除项目,但此方法将删除最后一项。请记住,set 是无序的,因此您不会知道被删除的是什么项目。
pop()
方法的返回值是被删除的项目。
3.3.4 获取 Set 的长度
要确定集合中有多少项,请使用 len()
方法。
获取集合中的项目数:
thisset = {"apple", "banana", "cherry"} print(len(thisset))
注意:{} 即空的花括号声明的是空的字典,不是空的集合。
4.字典的特点
(1)保存的时候都是以键值对的形式保存;
(2)健不能重复,但是值可以重复;【key 往往是字符串类型或者整型;如果键值重复,也不会报语法错误,但是后面的值会覆盖掉前面的值。】
(3)字典没有下标,因为底层实现基于哈希表。
4.2.字典的声明
(1)空字典的创建:dict() 或者{}
(2)有内容的字典:例如,dict1={key1:value1,key2:vales2,.....}。键值对与键值对之间用逗号隔开。
4.3.字典的获取
根据key等到value值:dict1[key];key如果不存在,会报错(KeyError),可通过字典的内置函数get()避免报错--dict1.get(key),如果找不到返回值是None,而不是报错。
或者为get()方法设置key不存在时的默认值---get(key,默认值)。
4.4.字典的增删改
(1)增加(也可以是修改)一个键值对:dict1[key]=value (可以理解为,没有方法只有格式);
(2)修改类似于增加,dict1[key]=value(此格式可以理解为,有则更新,无则增加);
(3)删除:dict1.pop(key)---删除键值对,并将值返回;
dict1.popitem()---不用传参,随机删除;返回值是(key,value).
(4)清除 clear()
4.5 其他取值
.keys() ----取出字典中所有的key值,对象类型是字典的keys,可以通过list()强制转换为列表类型;
.values() ---取出字典中所有的value值,同上,结果可以通过list强转。
.items() --- items() 函数以列表返回可遍历的(键, 值) 元组数组,主要目的是方便遍历访问。
#!/usr/bin/python # coding=utf-8 tinydict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'} print "字典值 : %s" % tinydict.items() # 遍历字典列表 for key,values in tinydict.items(): print key,values
第二部分 变量类型与复制
2.1 可变与不可变
不可变类型:只要改变变量的值,则地址发生了变化,则认为此类型是不可变的。
例如,int、str、float、tuple 、bool
可变类型:内容发生改变,但是地址没有改变,则认为此类型是可变类型的。
例如,list 、 set 、dict
2.2 浅拷贝与深拷贝
拷贝:就是将容器内数据,备份一份到新的地址;
浅拷贝:可变类型共用同一个(里面的内容改变,但是地址是不会改变);
不可变类型一开始是共用的,但是如果有发生改变的则地址就会发生改变。
例如:list1.copy();copy.copy(list).
深拷贝:列表中可变类型的变量(元素),会有一个新的地址,而不是像浅拷贝一样共用一个地址;
copy.deepcopy(list1)
第三部分 函数
函数:共用代码的分装,减少代码的冗余,增加复用性。
格式:def 函数名 ([参数,...]) ----此处的参数成为形参
函数体
函数调用:函数名([参数,...])----此处的参数为实参
3.1 函数的参数
a.普通参数---参数的个数,要求调用函数时与定义函数一致;
参数的类型:str,int,flat,bool,tuple;----》不可变的参数传递的是值;
list,set,dict -----》可变类型函数传递的是地址;
b.默认值参数---在定义函数时,对某个参数设置一个固定的值。注意:在定义默认值的时候,必须要放在参数的后面,否则报错。
关键字参数---在调用的时候,通过关键字的方式明确指明值是给哪一个参数。顺序不一致也没有影响,关键是能够明确给那个参数赋值。
c.可变参数、拆包与装包
格式1:def 函数名 (*args);------*args 可变的参数;注意:(1)当函数定义中出现可变参数,则在使用关键字参数的时候就要慎重;(2)函数的所有实际参数(实参)都无法给默认值参数赋值,可通过关键字的形式给a赋值。
格式2. def 函数名 (*args,**kwargs);----kwargs是keyword argument;*args --元组形式,底层会将所有的位置参数存放到args;**kwargs --字典形式,会将所有的关键字参数放到字典中。
3.2 函数间调用
兄弟函数可以直接调用。
3.3 函数的返回值
如果在函数中添加返回值,要通过return关键字实现,作用是:返回return后面的值【注意:return还有结束方法的作用,即跳出方法,跳出函数整个函数体。break:则是结束循环】。接收变量。如果函数没有返回值,则默认的返回值是None。Python 还可以通过return 返回多个值。多个返回值以元组的形式返回。
3.4 函数变量作用域(LEGB)
local-->局部的
enclosing-->嵌套的。内部函数;外部函数;内部函数的局部变量;外部函数的局部变量;全局变量
global-->全局的,
builtins-->系统内置的
作用域的使用:
不可变类型,在函数方法中,如果想修改全局的变量,必须在方法内通过global明确声明(否则提示错误 Unresolved referencr XXXX);可变类型不需要添加glabal的声明。此外,locals()--->在函数中使用,获取的是当前函数的局部变量们。将函数中的局部变量放到字典中;globals--->用在函数的外层,获取全局的变量(系统默认产生的变量和自定义的变量)。global关键字--->在函数中对全局变量进行声明使用的。nonlocal---->内部函数使用外部函数的变量。
总结:
搜索变量的规则是:(1)如果有内部函数,先找内部函数自身的变量;(2)如果内部函数自身没有变量,则找外部函数的变量;(3)如果外部函数也不存在此变量,则找全局;(4)如果全局也没有此变量则找builtins;(5)如果内部builtins也没有,则报错。
3.5 闭包
闭包特点如下
1.在一个函数中定义了另一个函数;
2.内层函数使用了外层函数的变量;
3.返回值是内层函数。
3.6 函数作为参数使用
实际上是传递的地址。
3.7 装饰器--decorator
装饰器的功能 (1) 引入日志;(2)函数执行时间统计;(3)执行函数前预备处理;(4)执行函数后清理功能;(5)权限验证等场景;(6)缓存。
函数名仅仅是个变量,只不过指向了定义的函数而已,所以才能通过 函数名()调用,如果 函数名=xxx 被修改了,那么当在执行 函数名() 时,调用的就不是之前的那个函数了。
题外话:写代码要遵循开放封闭原则,即已经实现的功能代码不允许被修改,但可以被扩展:(1) 封闭:已实现的功能代码块;(2)开放:对扩展开发。
A.定义装饰器函数,闭包的原则+函数作为参数;B.定义功能函数;C.@+函数名(装饰函数) 放到功能函数前。
装饰器装饰有参数和无参数的函数、装饰有返回值的函数。要装饰的函数有返回值,装饰器的内层函数也要有返回值。从而保证装饰后的函数与原函数保持一致性。
3.8 匿名函数
特点: 1.函数体非常简单;2.使用次数较少。作用:简化函数定义,使用方便。
定义格式:lambda 参数:返回值
3.9 高阶函数
把函数当初参数进行传递的函数。例如 1.sorted(iterable,key,reverse) ----其中key就是一个函数参数。例如,sorted(list,key=函数);通过key这个函数去指定排序规则。2.map(funcation,iterable)----映射;给一个可迭代的对象,通过函数的作用,将其转成一个新的对象,但是map()的返回值是一个map object。3.filter(funcation,iterable)---返回值是一个filter object,需要对返回值进行转换,一般使用list(filter object);funcation 函数的返回值必须是bool类型。4.reduce(funcation,sequence[,initial])--返回值是一个value。Apply a funcation of two arguments cumulatively to the items of a sequence,from left to right,so as to reduce the sequence to a single value.For example,reduce(lambda x,y:x=y,[1,2,3,4,5]) calculates ((((1+2)=3)+4)+5)。如果有初始值的化,则从初始值开始操作。参数funcation是函数,此函数的参数必须是两个。参数iterable是一个可迭代的对象。reduce()是functools模块中的一个函数。5.partial() ---偏函数,同样也是functools模块中的一个函数。偏函数(Patial function)是通过将一个函数的部分参数预先绑定为某些值,从而等到一个新的具有较少可变参数的函数。6.wraps()--Python 装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。即消除装饰器带来的一些副作用,例如,获取对象名、函数名、获取文档注释等。
3.10 递归函数
函数还可以自我调用,这种类型的函数被称为递归函数。
在使用递归时,需要注意:
(1)递归就是在过程或函数里调用自身
(2)必须有一个明确的递归结束条件,称为递归出口。不断的向出口靠近。
否则会有:RecursionError:maximum recursion depth exceeded while calling a Python object.
使用递归的优点,递归使代码看起来更加整洁、优雅;可以用递归将复杂任务分解成更简单的子问题;使用递归比使用一些嵌套迭代更容易
其缺点:递归的逻辑很难调试、跟进;递归调用的代价高昂(效率低),因为占用了大量的内存和时间。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2019-01-27 MySQL 基础知识梳理学习(五)----半同步复制