python函数、列表、元组、字典
一、函数
(一、基础
函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用它
函数的使用:
- 定义函数——封装独立的功能
- 调用函数——使用封装的功能
函数的作用:在开发过程中,函数可以优化代码的可读性、提高编写效率、将常用代码重用
(二、基本使用
1、定义函数
def 函数名():
函数封装的代码
......
注意:
- 函数名要做到见名知意
- 函数的名称要符合标识符的命名规则,即:由字母、数字和下划线组成;不能由数字开头;不能与关键字重名
2、函数的调用
直接通过 函数名()调用即可
注意:
- 定义一个函数只是封装了一段实现某种功能的代码而已,如果不主动调用函数,函数是不会主动执行的
- 不能将函数调用放在函数定义上方,否则会出现名称错误
- 在给函数添加注释时,要在定义函数的下方,使用三个连续的对引号,其中编写说明文字
- pycharm中在函数调用位置使用快捷键ctrl+q可查看函数说明信息
- 应在函数体上方保证两个空行的间隔,以保证函数视觉上的独立性
3、函数的参数
位置:函数名后面的小括号内,多个参数之间使用逗号连接
作用:增加函数的通用性,在函数内部对参数进行相同的处理
分类:
- 形参:定义函数时,小括号中的参数,作为变量使用
- 实参:调用函数时,小括号中的参数,用来把数据传递到函数内部
4、函数的返回值
作用:完成函数对数据的处理操作后,给调用者返回一个结果
关键字:return关键字,执行完之后后面的代码不会被执行
5、函数的嵌套调用
定义:在函数中又调用另外一个函数,在执行函数A时,执行到嵌套函数B之后,先执行函数完函数B,再回到函数A中,调用函数B的位置,继续执行后续代码。
嵌套函数练习:打印5行*组成的分隔线,要求能够打印任意重复次数的分隔线:
def print_line(char, times): print(char * times ) def print_lines(char, times): row = 0 while row<5: print_line(char, times) row += 1
6、使用模块中的函数
任何一个扩展名为py的python源代码文件都是一个模块,模块相当于一个工具包,用import导入,模块中的全局变量以及函数都可以在导入后通 模块名.变量 或 模块名.函数 进行重复使用。
模块名:同样是一个标识符,有数字、字母和下划线组成,不能以数字开头,不能与关键字重名。
7、函数的局部变量和全局变量
- 局部变量是定义函数内部定义的变量,只能在函数内部使用;
- 全局变量是在函数的外部定义的变量,所有的函数内部都可以使用这个变量
7.1局部变量
特点:
- 局部变量定义在函数的内部,只能在函数内部使用
- 函数执行结束后,局部变量会被系统回收
- 不同的函数可以定义相同的名字的局部变量,彼此之间不会产生影响
作用:
在函数内部,临时保存函数需要使用的数据
def demo1(): num = 10 print(num) num = 100 print("修改后num=%d" % num) demo1()
"""运行结果:10
修改后num=100"""
局部变量的生命周期:
- 局部变量在函数执行时才会被创建
- 函数执行结束后,即被系统回收
- 只适用于存储临时使用的数据
7.2全局变量
全局变量是定义在函数外部的变量,当函数执行时会先在函数内部寻找特定名称的局部变量,如果找不到就会在函数外部找是否有该名称的全局变量,如果都没有就会报错。
在函数内部可以使用全局变量,但是函数内部不能对全局变量进行修改
num = 1 def demo(): num = 10 print(num) demo() print(num) """输出结果:10 1"""
位置:为了保证所有的函数都可以调用全局变量,全局变量应定义在其他函数的上方
8.函数的参数及返回值
参数:当函数内部处理的数据不一定时,将外界的数据以参数的形式传递给函数
返回值:当调用者需要得到函数的结果时,可以用return关键字将结果返回,调用者可以用一个变量来接受函数返回的结果
一个函数执行后如何返回多个结果?
可用元组的方式将结果返回(注:当用元组返回多个结果时,括号是可以省略的)
def message():
name = "xiaoming"
age = 18
return name, age
message2 = message()
print(message2)
"""运行结果:('xiaoming', 18)"""
#可将一个元组使用赋值语句同时赋值给多个变量,注意:变量的个数要和元组中的元素个数一致
message3 = name1,age2 =message()
print(message3)
"""运行结果:('xiaoming', 18)"""
8.1不可变和可变的参数
无论传递的参数是可变的还是不可变的,在函数内部针对参数适用赋值语句不会影响到外部变量的引用,它相当于只是修改了局部变量的引用
def demo(num ,list): num = 10 list=[1,2,3] print(num) print(list) num = 1 list =[0,9,8] demo(num,list) print(num) print(list) """运行结果:10 [1, 2, 3] 1 [0, 9, 8]"""
但是在函数中调用方法对可变参数进行修改,是会改变影响外部数据的
def demo(list): list.append(6) print(list) list =[0,9,8] demo(list) print(list) """运行结果: [0, 9, 8, 6] [0, 9, 8, 6]"""
"+=”
在python中列表调用 =+ 本质上是在执行extend方法,所以外部数据是会改变的
def demo(num ,list): num += 10 list += list print(num) print(list) num = 1 list =[0,9,8] demo(num,list) print(num) print(list) """运行结果:11 [0, 9, 8, 0, 9, 8] 1 [0, 9, 8, 0, 9, 8]"""
但是不可变类型的参数是会改变的
8.2 缺省参数
定义函数时可以给某一参数一个默认值,即缺省参数,当调用者调用函数时没有传递缺省参数的值,就会传递默认参数,所以将常见的值传递给缺省参数会简化函数的调用。
在参数后面直接使用赋值语句就可以指定缺省参数
注意:
- 当有多个参数时,缺省参数必须要在参数列表的末尾
- 在调用函数时,有多个缺省参数的话,必须指定参数名
def demo(name,title="",gender=True): gender_text = "男生" if not gender: gender_text = "女生" print("[%s]%s 是 %s" % (title,name,gender_text)) demo("xiaoming",gender=True) """运行结果:(1, 2, 3) {'name': 'xiaoming', 'age': 18}"""
8.3多值参数
python中有两种多值参数:
- 参数名前有一个* ,可以接收元组
- 参数名前有两个*,可以接收字典
一般在给多值函数命名时《习惯使用以下两个名字
- *args——存放元组参数
- **kwargs——存放列表参数
def demo(*args,**kwargs): print(args) print(kwargs) demo(1,2,3,name="xiaoming",age=18) """运行结果为:(1, 2, 3) {'name': 'xiaoming', 'age': 18}"""
9、函数的递归
在一个函数内部调用自己本身的函数叫递归函数
特点:
- 函数的代码是相同的,只是针对参数不同,处理的结果不同
- 当参数满足一个条件时,函数不再执行,即函数的递归出口,必须有否则会出现死循环
def sum_num(num): if num ==1: return 1 temp = sum_num(num-1) return temp+num print(sum_num(6)) #运行结果21
二、高级变量
python中变量可以分为数字型和非数值型两种
数字型:
- 整数(int)
- 浮点型(float)
- 布尔型(bool)真:True(非零即真);假:False 0
- 复数型(complex)
非数字型:
- 元组
- 列表
- 字典
- 字符串
python中所有非数字变量都有以下特点:
- 都是一个序列,相当于一个容器
- 都可以进行切片操作
- 都可以重复 * 和链接 +
- 都可以计算长度、最大值、最小值、比较、删除
- 取值[ ]
- 遍历for in
(一、列表
- 列表list用来储存一串信息,在python中时使用最频繁的数据类型;
- 用[ ]定义,数据之间用 , 隔开
- 列表的索引(即位置编号)从0开始(在列表中取数时不能超过索引范围,否则会报错)
1、列表的常用操作
在python3中定义一个列表,输入 列表名. 再按TAB键盘,会提示列表能够使用的方法
| 序号 | 分类 | 关键字/函数/方法 | 说明 |
| 1 | 增加 | 列表.insert(索引,数据) | 在指定位置插入数据 |
| 列表.append(数据) | 在末尾追加数据 | ||
| 列表.extend(另一列表) | 将另一列表的数据追加至此列表 | ||
| 2 | 修改 | 列表[索引] = 数据 | 修改指定索引的数据 |
|
3、 |
删除 | 列表.pop | 删除末尾数据 |
| 列表.pop[数据] | 删除指定索引数据 | ||
| 列表.remove[数据] | 删除第一个出现的指定数据 | ||
| 列表.clear | 清空列表 | ||
| del列表[索引] | 删除指定索引的数据 | ||
| 4、 | 统计 | len(列表) | 列表的长度 |
| 列表.count(数据) | 数据在列表中出现的次数 | ||
| 5、 | 排序 | 列表.sort() | 升序排序 |
| 列表.sort(reverse=True) | 降序排序 | ||
| 列表.reverse() | 逆序、反转 |
1.1 循环遍历
遍历就是从头到尾依次从列表中获取数据,可以再循环内部针对每一个元素做同样的操作在python中提供迭代遍历,利用for就可以实现迭代遍历
num_list=[1,2,3] for num in num_list: print(num) """运行结果为:1 2 3 """
(二、元组
1、元组(tuple)的定义和列表类似不同之处在于元素不能修改
- 元组用()定义
- 元组的索引从0开始
注意:元组中只包含一个元素时需要在元素后面加一个,eg:info_tuple = (1,)
2、元组中的元素不能改变,所以元组可调用的函数只有
元组名.count(数据):用来查看数据在元组中出现的次数
元组名.index(数据):用来查看数据第一次出现的索引
3、循环遍历,和列表的循环遍历相同,使用for
4、应用场景
- 函数的多值参数和返回值
- 格式化字符串
- 让列表不可以被修改
5、元组和列表的转变
- 使用list函数可以将元组转变为列表 list(元组)
- 使用tuple函数可以将列表转变为元组 tuple(列表)
(三、字典
1、字典用{ }定义,使用键值对存储数据,键值对之间用 ,隔开,用来描述一个物体的相关信息
- 字典的键key是索引
- 值value是数据
- 键和值之间用 : 链接
- 键必须是唯一的
- 值可以使用任何数据类型,但是键只能使用字符串、数字和元组
2、和列表的区别:列表是有序的对象集合,字典是无序的对象集合
xiaoming = {"name":"xiaoming","age":18,"height":175}
print(xiaoming)
"""运行结果:{'name': 'xiaoming', 'age': 18, 'height': 175}"""
3、循环遍历
for 循环内部使用的“key”的变量,in字典
(四、字符串
1、字符串就是一串字符,是编程语言中表示文本的数据类型
注意:
- 在python中可以使用一对双引号或者一对单引号,来定义字符串
- 如果在字符串内部需要使用 " ,可以使用 ' 定义字符串
- 如果在字符串内部需要使用 ' ,可以使用 " 定义字符串
- 也可以使用索引,获取一个字符串内部指定位置的字符
- 也可以使用for循环遍历字符串中的每个字符
2、字符串的常用操作:
3、字符串的切片
切片适用于字符串、列表及元组
切片使用索引值来限定范围,可以从一个大的字符串里切出一个小的字符串
列表和元组是一个有序的集合,直接使用索引就可以切出想要的内容,但是字典是无序的集合,不提供对字典的切片
切片操作:字符串[开始索引:结束索引:步长]
注意:
- 索引的指定区间是左闭右开型
- 从头开始,索引可以省略但是冒号不能省略 eg:字符串[ : 6] 即为截取从开始到5位置的字符串
- 到末尾的索引,结束索引数字也可以省略,但是冒号也不能省略
- 步长默认为1,如果是连续的进行切片的话,步长也是可以省略的
字符串的切片不知可以顺序也可以逆序,逆序时将步长设为-1 eg:字符串的逆序:字符串名[ : : -1]
(五:公共方法
1、python内置函数
| 函数 | 描述 | 备注 |
| len(item) | 计算容器中元素的个数 | |
| del(item) | 删除容器中的元素 | del的特殊用法 |
| max(item) | 返回容器中元素的最大值 | 如果是字典,只针对key比较 |
| min(item) | 返回容器中的最小值 | 如果是字典,只针对key比较 |
注意:del删除的是引用而不是数据本身,由于python都是引用,而python有GC机制,所以,del语句作用在变量上,而不是数据对象上。
-
if __name__=='__main__': a=1 # 对象 1 被 变量a引用,对象1的引用计数器为1 b=a # 对象1 被变量b引用,对象1的引用计数器加1 c=a #1对象1 被变量c引用,对象1的引用计数器加1 del a #删除变量a,解除a对1的引用 del b #删除变量b,解除b对1的引用 print(c) #最终变量c仍然引用1
del删除的是变量,而不是数据。
if __name__=='__main__': li=[1,2,3,4,5] #列表本身不包含数据1,2,3,4,5,而是包含变量:li[0] li[1] li[2] li[3] li[4] first=li[0] #拷贝列表,也不会有数据对象的复制,而是创建新的变量引用 del li[0] print(li) #输出[2, 3, 4, 5] print(first) #输出 1
2、切片
| 描述 | python中的表达式 | 结果 | 支持的数据类型 |
| 切片 | “1234568”[ : : -2] | "8531" | 列表、元组、字符串 |
3、运算符
| 运算符 | python表达式 | 结果 | 描述 | 支持的数据类型 |
| + | [1,2]+4,3] | [1,2,3,4] | 合并 | 元组、列表、字符串 |
| * | ["h"]*3 | ["h","h","h"] | 重复 | 元组、列表、字符串 |
| in | 3 in (1,2,3) | True | 元素是否存在 | 元组、列表、字符串、字典(字典只能针对key判断) |
| not in | 4 not in(1,2,3,4) | True | 元素是否不存在 | 元组、列表、字符串、字典(字典只能针对key判断) |
| > >= < <= == | (1,2,3)<(2,2,3) | True | 元素比较 | 字符串,元组,列表 |
注意:
- in和not in被称为成员运算符
- 在用in 和not in对字典进行运算时,实质上是在针对key进行判断