目录
二十一、函数基础定义
1.解释:
是组织好的,可重复使用的,用来实现特定功能的代码段。
2.为什么要用函数呢?
为了得到一个针对特定需求、可供重复利用的代码段提高程序的复用性,减少重复性代码,提高开发效率
3.定义:
def 函数名(传入参数): 函数体 return 返回值 函数名(参数) |
注意:①参数如不需要,可以省略
②返回值如不需要,可以省略
③函数必须先定义后使用
二十二、函数参数
1.解释:
传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
2.定义:
# 定义函数
def add(x,y):
result=x+y
print(f"{x}+{y}的结果是:{result}")
# 调用函数
add(1,2)
函数定义中,提供的x和y,称之为:形式参数(形参),表示函数声明将要使用2个参数·
参数之间使用逗号进行分隔
函数调用中,提供的5和6,称之为:实际参数(实参),表示函数执行时真正使用的参数值
传入的时候,按照顺序传入数据,使用逗号分隔
注意:传入参数的数量是不受限制的,可以不使用参数,也可以仅使用任意N个参数
二十三、函数返回值
1.解释:
所谓“返回值”,就是程序中函数完成事情后,最后给调用者的结果
2.定义:
# 定义函数
def add(x,y):
result = x+y
# 返回返回值result
return result
# 调用函数
num = add(1,2)
# 输出返回值
print(num)
变量就是能接收到函数的返回值
语法就是:通过return关键字,就能向调用者返回数据
注意:函数体在遇到return后就结束了,所以写在return后的代码不会执行。
思考:
之前说返回值可以缺省,那么缺省的函数有返回值么?
答:有的。Python中有一个特殊的字面量:None,其类型是:<class'NoneType'>
无返回值的函数,实际上就是返回了:None这个字面量
# 定义函数
def my_print():
print("击泥胎梅")
# 调用函数
test = my_print()
# 输出返回值
print(f"返回值为{test},返回值类型为{type(test)}")
结果:
补充:None
1.解释
None表示:空的、无实际意义的意思,类型是:<class'NoneType'>
函数返回的None,就表示,这个函数没有返回什么有意义的内容。也就是返回了空的意思。
None可以主动使用return返回,效果等同于不写return语句
2.应用场景
None作为一个特殊的字面量,用于表示:空、无意义,其有非常多的应用场景。
①、用在函数无返回值上
②、用在if判断上
在if判断中,None等同于Flase
一般用于在函数中主动返回None,配合if判断做相关处理
# 定义函数
def your_age(age):
if age >= 18:
return 'SUCCESS'
# 调用函数,当年龄小于18时,test为None
test = your_age(int(input("请输入你的年龄\n")))
# 当test为None时,not None为真,于是输出语句
if not test:
print("对不起,未满十八岁不能进入")
结果:
③用在声明无内容的变量上
定义变量,但暂时不需要变量有具体值,可以用None来代替
# 暂不赋予变量具体值
name = None
二十四、函数说明文档
函数是纯代码语言.想要理解其含义,就需要一行行的去阅读理解代码,效率比较低。
我们可以给函数添加说明文档,辅助理解函数的作用。
语法如下:
def func(x, y): """ 函数说明 :param x:形参x的说明 :paramy:形参y的说明 :return:返回值的说明 """ 函数体 return 返回值 |
通过多行注释的形式,对函数进行说明解释
内容应写在函数体之前
#定义函数,进行文档说明
def add(a,b):
"""
add函数可以接收2个参数,进行2数相加的功能
:param a: 形参a表示相加的其中一个数字
:param b: 形参b表示相加的另外一个数字
:return: 返回值是2数相加的结果
"""
result = a + b
print(f"2数相加的结果是:{result}")
return result
注:
:param 用于解释参数
:return用于解释返回值
在PyCharm编写代码时,可以通过鼠标悬停,查看调用函数的说明文档
二十五、函数的嵌套
所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数
def func_b():
print("---2---")
def func_a():
print("---1---")
func_b()
print("---3---")
# 调用函数func_a
func_a()
结果:
注意:如果函数A中,调用了另外一个函数B,那么只有先把函数B中的任务都执行完毕之后才会回到上次函数A执行的位置,进行执行之后的内容
二十六、局部变量AND全局变量
变量作用域指的是变量的作用范围 (变量在哪里可用,在哪里不可用)
主要分为两类:局部变量和全局变量
1.局部变量:
局部变量是定义在函数体内部的变量,即只在函数体内部生效
def testA():
num = 100
print(num)
testA() #输出100
print(num) #报错:name'num'isnot defined
num是定义在“testA”函数内部的变量,在函数外部访问则立即报错
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
2.全局变量
全局变量,指的是在函数体内外都能生效的变量
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
思考:下面这段代码会print(num)输出什么,100还是200?
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
num = 200
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
print(num)
结果:
为什么在testB中把num修改成200了,最后输出的num还是100呢?
这是因为testB中把num修改成200的是局部变量,相当于在testB中重新定义了一个局部变量num并赋值为200,而不是修改全局变量num,那么我们是不是就没办法在函数中修改全局变量了呢?
答案肯定是可以的,python特意写了global关键字来应对上述情况。
3.global关键字
使用global关键字可以在函数内部声明变量为全局变量
#定义全局变量a
num = 100
def testA():
print(num)#访问全局变量num,并打印变量num存储的数据
def testB():
global num
num = 200
print(num)#访问全局变量num,并打印变量num存储的数据
testA() # 输出100
testB() # 输出100
print(num)
结果:
如上所示:要在函数中修改全局变量,需要使用global关键字将函数内定义的变量声明为全局变量
二十六、数据容器
Python中的数据容器:
一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素
每一个元素,可以是任意类型的数据,如字符串、数字、布尔等。
数据容器根据特点的不同,如:
是否支持重复元素
是否可以修改
是否有序,等
分为5类,分别是:
列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict)
二十七、列表
1.语法:
#字面量 [元素1,元素2,元素3,元素4,...] #定义变量 变量名称=[元素1,元素2,元素3,元素4,...] #定义空列表 变量名称尔=[] 变量名称尔= list() |
列表内的每一个数据,称之为元素
以[]作为标识
列表内每一个元素之间用“,”逗号隔开
#定义一个列表list
my_list = ["itheima","itcast","python"]
print(my_list)
print(type(my_list))
my_list = ["itheima", 666, True]
print(my_list)
print(type(my_list))
#定义一个嵌套的列表
my_list = [[1, 2, 3],[4,5,6]]
print(my_list)
print(type(my_list))
注意:元素的数据类型没有任何限制,甚至元素也可以是列表,支持嵌套列表
2.列表的下表(索引)
列表中的每一个元素,都有其位置下标索引,从前向后的方向,从0开始,依次递增我们只需要按照下标索引,即可取得对应位置的元素。
#语法:列表[下标索引]
name_list = ['Tom','Lily','Rose']
print(name_list[0])#结果:Tom
print(name_list[1])#结果:Lily
print(name_list[2])#结果:Rose
当然我们强大的python是支持反向索引的
也就是从后往前,从-1开始,依次递(-1,-2,-3...)
#语法:列表[下标索引]
name_list = ['Tom','Lily','Rose']
print(name_list[-3])#结果:Tom
print(name_list[-2])#结果:Lily
print(name_list[-1])#结果:Rose
注意:下标索引的取值范围,超出范围无法获取元素,并且会报错
正向下标是从0开始,要取第1个元素要xx[0],取第3个元素为xx[2]
反向下标是从-1开始,要取最后1个元素要xx[-1]
3.列表常见功能
列表也提供了一系列功能:插入元素、删除元素、清空列表、修改元素、统计元素个数等等功能,这些功能我们都称之为:列表的方法
数是一个封装的代码单元,可以提供特定功能。在Python中,如果将函数定义为class(类)的成员,那么函数会称之为:方法
方法和函数功能一样,有传入参数,有返回值,只是方法的使用格式不同:
#函数
def add(x,y):
return x+y
#函数的使用
num = add(1,2)
#方法
class Student:
def add(self,x,y):
return x+y
#方法的使用:
student = Student()
num = student.add(1,2)
方法和函数功能一样,有传入参数,有返回值,只是方法的使用格式不同,关于方法的具体内容我们在后续的文章里会进行更新,现在就先当成函数使用
①、查找某个元素的下标
功能:查找指定元素在列表的下标如果找不到,报错ValueError
语法:列表:index.(元素)
index就是列表对象(变量)内置的方法(函数)
mylist = ["ikun","geigei","lizhi"]
# 查找某元素在列表内的下标索引
index = mylist.index("ikun")
print(f"ikun在列表中的下标索引值是:{index}")
#如果被查找的元素不存在,会报错
index = mylist.index("hello")
print(f"hello在列表中的下标索引值是:{index}")
结果:
②、修改特定位置(索引)的元素值
语法:列表[下标] = 值
直接对指定下标(正向、反向下标均可)的值进行:重新赋值(修改)
#正向下标
my_list = [1, 2, 3]
my_list[0] = 5
print(my_list) # 结果:[5,2,3]
# #反向下标
my_list = [1, 2, 3]
my_list[-3] = 5
print(my_list) # 结果: [5,2,3]
③、插入元素
语法:列表.insert(下标,元素),在指定的下标位置,插入指定的元素
注意:这里可以用-1,但是-1并不会插入到列表的尾部,而是插入到倒数第二个的位置,也就是例子里面2和3的中间
my_list =[1,2,3]
my_list.insert(1, "ikun")
print(my_list) #结果::[1,"ikun",3,4]
④、追加元素
语法1:列表.append(元素),将指定元素,追加到列表的尾部
my_list =[1,2,3]
my_list.append(4)
print(my_list) # 结果:[1,2,3, 4]
语法2:列表.extend(其它数据容器),将其它数据容器的内容取出,依次追加到列表尾
my_list = [1,2,3]
my_list.extend([4,5,6])
print(my_list) # 结果:[1,2,3,4,5,6]
⑤、删除元素
语法1:del列表[下标]
语法2:列表.pop[下标]
注意:这里的del是直接删除元素,而pop可以用一个变量来接收你删除的函数
my_list =[1,2,3]
del my_list[0]
print(my_list) # 结果:[2,3]
num = my_list.pop(0)
print(num) # 结果:1
print(my_list) # 结果:[2,3]
语法3:列表.remove(元素) 这里是删除某元素在列表中的第一个匹配项
my_list=[1,2,3,2,3]
my_list.remove(2)
print(my_list)#结果:[1,3,2,3]
注意:这里只能删除第一个匹配项,如果需要删除多个,需要执行多次语句,当删除项不存在时,程序报错
⑥、清空列表内容
语法:列表.clear()
my_list =[1,2,3]
my_list.clear()
print(my_list)#结果:[]
⑦、统计某元素在列表内的数量
语法:列表.count(元素)
my_1ist=[1,1,1,2,3]
print(my_1ist.count(1)) #结果:3
⑧、统计元素
语法:len(列表)
my_1ist=[1,1,1,2,3]
print(len(my_1ist)) # 结果:5
⑨、小结
编号 | 使用方式 | 作用 |
1 | 列表.append(元素) | 向列表中追加一个元素 |
2 | 列表.extend(容器) | 将数据容器的内容依次取出,追加到列表尾部 |
3 | 列表.insert(下标,元素) | 在指定下标处,插入指定的元素 |
4 | del 列表[下标] | 删除列表指定下标元素 |
5 | 列表.pop(下标) | 删除列表指定下标元素 |
6 | 列表.remove(元素) | 从前向后,删除此元素第一个匹配项 |
7 | 列表.clear() | 清空列表 |
8 | 列表.count(元素) | 统计此元素在列表中出现的次数 |
9 | 列表.index(元素) | 9查找指定元素在列表的下标,找不到报错ValueError |
10 | len(列表) | 统计容器内有多少元素 |
4.列表的遍历
既然数据容器可以存储多个元素,那么,就会有需求从容器内依次取出元素进行操作。将容器内的元素依次取出进行处理的行为,称之为:遍历、迭代。
如何遍历列表的元素呢?可以使用前面学过的while循环
如何在循环中取出列表的元素呢?使用列表[下标]的方式取出
循环条件如何控制?定义一个变量表示下标,从0开始,循环条件为下标值<列表的元素数量
my_1ist=[1,1,1,2,3]
# 定义一个变量来标记列表的下标
index = 0 # 初始值为0
print(my_1ist)
# 通过len()获取列表长度作为判断条件,这里需要注意因为下标是从0开始,所以遍历5个元素的列表,下标只需要到4就可以了,所以判断条件不需要<=
while index < len(my_1ist):
print(f"元组第{index+1}个元素是{my_1ist[index]}")
# 将循环变量(index)每一次循环都+1,缺少的话会导致死循环
index += 1
结果:
除了while循环外,Python中还有另外一种循环形式:for循环。
对比while,for循环更加适合对列表等数据容器进行遍历。
语法:
for 临时变量 in 数据容器:
对临时变量进行处理
表示,从容器内,依次取出元素并赋值到临时变量上
在每一次的循环中,我们可以对临时变量(元素)进行处理。
my_1ist=[1,1,1,2,3]
print(my_1ist)
for i in my_1ist:
print(f"元组元素有:{i}")
结果:
while循环和for循环,都是循环语句,但细节不同:
在循环控制上:
while循环可以自定循环条件,并自行控制
for循环不可以自定循环条件,只可以一个个从容器内取出数据
在无限循环上:
while循环可以通过条件控制做到无限循环
for循环理论上不可以,因为被遍历的容器容量不是无限的
在使用场景上:
while循环适用于任何想要循环的场景
for循环适用于,遍历数据容器的场景或简单的固定次数循环场景
5.列表总结
经过上述对列表的学习,可以总结出列表有如下特点:
可以容纳多个元素(上限为2**63-1、9223372036854775807个)
可以容纳不同类型的元素 (混装)
数据是有序存储的 (有下标序号)
允许重复数据存在
可以修改 (增加或删除元素等)