Python学习——函数

前言

1.声明:本次是作者学习Python的记录文档,只挑选了重点,可能会有一些缺陷甚至错误。

2.学习目的:从零搭建Python认知,掌握基础语法、建立代码思维

一、初始函数

python 复制代码
name = "lanzhishujiaxueyuan"
# 需求:统计字符串的长度

length = len(name)
print(f"字符串name的长度是:{length}")
"""
len()是python内置的函数
    # 提前写好的
    # 可以重复使用
    # 实现统计长度这以特定功能的代码段
"""
# 需求:不使用内置函数len(),完成字符串长度的计算

name2 = "haihai! zhe li shi ya bian kan wu !"
# 定义一个计数变量
count = 0
# 使用for循环变量
for i in name2:
    count += 1    # count = count + 1  count = 0 + 1

print(f"字符串{name2}的长度是:{count}")


name3 ="haihia! wawawawa!"
# 定义一个计数变量
count = 0
# 使用for循环变量
for i in name3:
    count += 1    # count = count + 1  count = 0 + 1

print(f"字符串{name3}的长度是:{name3}")

# 每统计一个字符串的长度都需要写一个for循环,非常麻烦,代码 冗余

str1 = "ddddddkkkkdasd asdasdasd"
str2 = "ddddddddggggkkkkdasd asdasdasd"
str3 = "dddddfffdkkkkdasd asdasdasd"
# 可以使用函数,来优化这些功能

def my_len(data):
    count = 0
    for i in data:
        count += 1
    print(f"字符串{data}的长度是:{count}")

# 使用函数
my_len(str1)
my_len(str2)
my_len(str3)

二、函数的定义

复制代码
函数定义语法格式:
def 函数名(传入的参数):   # 参数暂不讨论
    函数体
    return 返回值       # 返回值暂不讨论

函数使用语法格式:
函数名(参数)

def 函数名():
    函数体
python 复制代码
def yabian():
    print("崖边看雾!")
yabian()

例子

python 复制代码
​
"""定义一个函数,函数名随意,要求调用函数后可以输出一下欢迎语:
早上好!
请刷脸开门!
"""
# 定义一个函数
def face_scan():
    # 输出
    print("早上好!\n请刷脸开门!")

# 使用函数
face_scan()

​

三、函数参数

复制代码
掌握函数传入参数的使用
函数传入参数功能:在函数进行计算的时候,接收外部(调用时)提供的数据。
函数定义语法格式:
def 函数名(传入的参数):
    函数体

函数传入的参数:函数传入参数的数量是不受限制的。
    (1)可以不使用参数
    (2)也可以使用N个参数
python 复制代码
# 需求:要求使用函数完成两个数据相加的功能
def add(x,y):
    result = x + y
    print(f"{x} + {y} 的结果是:{result}")

# 使用
add(4,4)
复制代码
函数解析:
1、函数定义中,提供的x和y,称之为:形式参数(形参),表示函数声明将要使用2个参数,参数之间使用逗号分隔。
2、函数使用中,提供的4和4,称之为:实际参数(实参),表示函数执行的时候真正使用的参数值,传入的时候,按照顺序传入数据,使用逗号分隔。

练习

练习:升级自动刷脸

定义一个函数,函数名随意,并接受一个参数传入(数字类型,是否是本人)

在函数体内进行本人判断(1本人,0非本人),并输出如下内容:

早上好!请刷脸开门!

人脸识别中,您的状态码为:1,本人,请进。

早上好!请刷脸开门!

人脸识别中,您的状态码为:0,非本人,请离开

python 复制代码
def face_scan(is_me):
    print("早上好!请刷脸开门!")
    if is_me == 1:
        print("人脸识别中,您的状态码为:1,本人,请进。")
    else:
        print("人脸识别中,您的状态码为:0,本人,非本人,请离开。")


# 调用函数
face_scan(0)

四、函数返回值

复制代码
1、函数返回值的定义
学习目标:
    (1)掌握函数返回值的作用
    (2)掌握函数返回值的定义语法
函数返回值:就是程序中函数完成事情后,最后给调用者的结果。
函数返回值语法格式:
def 函数名(参数......):
    函数体
    return 返回值

函数使用语法格式:
变量名 = 函数名(参数.....)

2、None类型
思考?如果函数没有使用return语句返回数据,那么函数有返回值吗? 有的
python中有一个特殊字面量:None,其类型是:<class 'NoneType'>
无返回值的函数,实际上就是返回了None字面量

None:表示空的,无实际意义的,
函数返回None,就表示这个函数没有返回什么有意义的内容,也就是返回空的意思。

None类型的使用场景:
复制代码
    1、用在函数无返回值
    2、用在if判断上
        (1)在if判断中None相当于False
        (2)一般用在函数中主动返回None,配合if判断做相关处理
    3、用于声明无内容的变量上
        (1)定义变量,但暂时不需要变量有具体的值,可以用None类型
python 复制代码
def add(a,b):
    result = a + b
    return result

r = add(1,2)
print(r)
python 复制代码
def add2(a,b):
    result = a + b
r2 = add2(1,2)
print(r2)
python 复制代码
​
# 主动返回None
def say_hi():
    print("hello func!")
    return None
result = say_hi()
print(f"主动返回None函数的内容是:{result},其类型是:{type(result)}")

​
python 复制代码
# None 用在if判断上
def check_age(age):
    if age > 18:
        return "成年!"
    else:
        return None
result2 = check_age(17)
if not result2:
    print("年龄小于18")
python 复制代码
# 用在声明变量上
name = None
age = None

五、函数说明文档

复制代码
1、掌握通过注释对函数进行解释说明

函数是纯代码语言,想要理解其含义就需要一行行去阅读理解代码,效率比较低
可以给函数添加说明文档,辅助理解函数的作用。
"""
# 函数说明文档语法格式:
# def func(x,y):
#     """
#     函数说明
#     :param x: 形参x的说明
#     :param y: 形参y的说明
#     :return: 返回值
#     """
#     函数体
#     return 返回值
python 复制代码
# 定义一个函数,进行文档说明
def add(a,b):
    """
    add函数可以接收2个参数,进行两数相加的功能。
    :param a: 形参a表示相加的一个数字
    :param b: 形参a表示相加的另一个数字
    :return: 返回值是两数相加的结果
    """
    result = a + b
    print(f"a+b的结果是:{result}")
    return result

# 使用函数,在pycharm中编写代码时,可以通过鼠标悬停,查看调用函数的说明文档。
add(1,2)

六、函数的嵌套使用

复制代码
学习目标:
    1、掌握函数的嵌套使用
    2、理解嵌套调用的执行流程

函数嵌套调用:指的是一个函数里面又调用了另外一个函数,
执行流程:如果函数A中,调用另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次函数A执行的地方继续执行
python 复制代码
# 定义函数B
def func_B():
    print("***1***")  ##第二个输出
# 定义函数A
def func_A():    #第一步执行
    print("***2***")   ##第一个输出
    # 使用函数B
    func_B()   ##回到函数B的定义
    print("***3***")  ##第三个输出
# 调用函数A
func_A()

七、变量的作用域

变量的作用域(作用范围):变量作用域指的是变量的作用范围(变量在哪里可用,哪里不可用)

变量的作用域分类:

局部变量:在函数体内部的变量,即只在函数体内生效

局部变量作用:在函数体内部,临时保存数据,即当函数调用完后,则销毁局部变量

全局变量:指的是在函数体内、外都能生效的变量

global 关键字:可以在函数体内部声明变量为全局变量

python 复制代码
# 在函数内修改全局变量
# 定义一个全局变量
a = 100

# 定义一个函数B
def func_B():
    print(a)

def func_C():
    global a  ##此处声明a为全局变量
    a = 200
    print(a)

func_B()
func_C()
print(a)

八、综合案例

"""

综合案例:ATM

定义一个全局变量:money,用来记录银行卡余额(默认余额为:60000000)

定义一个全局变量:name,用来记录客户姓名(程序启动时输入)

定义如下函数:

查询余额函数

存款函数

取款函数

主菜单函数

要求:

程序启动后要求输入客户姓名

查询余额、存款、取款后都会返回主菜单

存款、取款后,都应显示一下当前余额

客户选择退出或者输入错误,程序会退出,否则会一直运行

主菜单效果:

---------------------主菜单-----------------------------

xxxx,您好,欢迎来到数加银行ATM。请选择操作:

查询余额 【请输入1】

存款 【请输入2】

取款 【请输入3】

退出 【请输入4】

请输入您的选择:

查询余额的效果:

---------------------查询余额-----------------------------

xxxx,您好,您的余额剩余:60000000元

存、取款效果:

---------------------存款-----------------------------

xxxx,您好,你存款50000元成功!

xxxx,您好,您的余额剩余:60050000元.

---------------------取款-----------------------------

xxxx,您好,你取款50000元成功!

xxxx,您好,您的余额剩余:60000000元.

"""

python 复制代码
# 定义全局变量
money = 60000000
name = None
# 要求输入姓名
name = input("请输入您的姓名:")


# 定义查询余额函数
def query(is_show): ##布尔值参数
    if is_show:   ##为真,则运行下一行的标题
        print("---------------------查询余额-----------------------------")
    print(f"{name},您好,您的余额剩余:{money}")


# 定义存款函数
def saving(num):
    global money
    money += num
    print("---------------------存款-----------------------------")
    print(f"{name}, 您好,你存款{num}元成功!")
    # 调用查询函数
    query(False)


# 定义取款函数
def get_money(num):
    global money
    money -= num
    print("---------------------取款 - ----------------------------")
    print(f"{name}, 您好,你取款{num}元成功!")
    query(False)

# 定义主菜单函数
def main():
    print("---------------------主菜单-----------------------------")
    print(f"{name},您好,欢迎来到数加银行ATM。请选择操作:")
    print("查询余额  【请输入1】")
    print("存款     【请输入2】")
    print("取款    【请输入3】")
    print("退出   【请输入4】")
    return input("请输入您的选择:")




# 程序一直执行 无限循环
while True:
    # 调用主菜单函数
    key_word = main()
    # print(key_word)
    # 判断用户的选择
    if key_word == "1":
        query(True)
        # 结束本次循环
        continue
    elif key_word == "2":
        # 输入存的钱
        num = int(input("请输入您要存多少钱:"))
        saving(num)
        # 结束本次循环
        continue
    elif key_word == "3":
        # 取多少钱
        num = int(input("请输入您取款多少钱?"))
        get_money(num)
        # 结束本次循环
        continue
    else:
        print(f"程序退出")
        break

九、列表

数据容器:一种可以容纳多份数据的数据类型,容纳的每一份数据称之为一个元素,每一个元素,可以是任意类型的数据,如:字符串、数字、布尔等。

数据容器的分类:

列表(List)、元组(Tuple)、字符串(Str)、集合(Set)、字典(dict)

列表(List):

1、列表的定义

2、列表的下标索引

3、列表的常用操作

学习目标:

(1)掌握列表的定义格式

(2)掌握使用列表的下表索引从列表中取出元素

(3)掌握列表的常用操作(方法)和特点

列表定义语法格式:

1、字面量

元素1,元素2,元素3,元素4,元素5,元素6,.....

2、定义列表变量

变量名称 = 元素1,元素2,元素3,元素4,元素5,元素6,.....

3、定义空列表

变量名 = \[\]

变量名 = list()

列表:列表内的每一个数据,称之为元素,以\[\]作为标识,列表内的每一个元素之间使用逗号隔开。

列表的下标(索引):

列表的每一个元素,都有编号,称之为下标索引。

列表的正向索引:从前向后方向,编号从0开始。

语法格式:

列表下标索引

列表的反向索引:从后向前方向,编号从-1开始。

语法格式:

列表下标索引

嵌套列表的下标索引语法格式:

列表外层标号内层标号

列表的常用操作:

如:插入元素、删除元素、清空列表、修改列表、统计元素个数等常用功能。

1、列表的查询功能

查询某元素的下标

语法:列表.index(元素):查找指定元素在列表中的下标,如果找不到,则报错:ValueError

2、修改特定位置(索引)的元素值

语法:列表下标 = 值 :直接对指定下标(正向、反向下标)的值进行重新赋值(修改)

3、插入元素

语法:列表.insert(下标,值):在指定的下标位置,插入新的元素

4、追加元素

语法:列表.append(元素):将指定元素追加到列表的末尾。

5、追加元素2

语法:列表.extend(其他数据容器):将其他数据容器内容取出,依次追加到列表的末尾

6、删除元素1

语法1:del 列表下标

7、删除元素2

语法2:列表.pop(下标)

8、删除某元素在列表中的第一个匹配项

语法:列表.remove(元素)

9、清空列表内容

语法:列表.clear()

10、统计列表中元素的个数

语法:len(列表)

总结:

列表的特点

1、可以容纳多个元素

2、可以容纳不同数据类型的数据(混装)

3、数据是有序存储的(下标索引)

4、允许重复数据存在

5、可以修改(增加删除....)

python 复制代码
# 列表字面量
["hai!","hiahia!","崖边看雾"]
print(["hai!","hiahia!","崖边看雾"])

#列表自变量
my_list = ["hai!","hiahia!","崖边看雾"]
print(my_list)
print(type(my_list))

#空列表
my_list1 = []
print(my_list1)
print(type(my_list1))

my_list2 = list()
print(my_list2)
print(type(my_list2))

my_list3 = ["hai!","hiahia!","崖边看雾",8888,True,'66']
print(my_list3)

# 定义一个嵌套列表
my_list4 = [[1,2,3,4],["a","b","c"]]
print(my_list4)
python 复制代码
#*********************列表的下标索引****************
my_list5 = ["python","linux","mysql","hadoop"]

# 需求:正向取mysql这个元素
print(my_list5[2])  ##从0开始
# 需求:反向取mysql这个元素
print(my_list5[-2])   ##从-1开始

#**************嵌套列表下标索引***************
my_list6 = [[1,2,3,4],["a","b","c"]]
print(my_list6[0][2])  ##第一个代表第几组,后面代表如何索引
print(my_list6[1][1])
print(my_list6[0][-1])
print(my_list6[1][-2])
python 复制代码
#***********列表的常用操作*************
#index()从左往右查找目标元素,只返回第一个匹配元素的下标(索引)
my_list7 = ["python","linux","python","mysql","python","hadoop","hdfs","mapreduce","linux","python","linux","linux","yarn","hive"]
result1 = my_list7.index("python")
print(result1)


# result2 = my_list7.index("python1111")  # 报错
# print(result2)


# 列表[下标] = 值
print(f"修改前列表的结果是:{my_list7}")
my_list7[2] = "pandas"
print(f"修改后列表的结果是:{my_list7}")


# 列表.insert(下标,值)
my_list7.insert(5,"spark")
print(f"插入新值后的列表结果是:{my_list7}")

# 列表.append(元素)
my_list7.append("flink")
print(f"追加新元素后的结果是:{my_list7}")


# 列表.extend(其他数据容器)
my_list7.extend([1,2,3,4,5])
print(f"追加新元素后的结果是:{my_list7}")

# del 列表[下标]

del my_list7[5]
print(f"删除元素后的列表结果是:{my_list7}")

# 列表.pop(下标),按下标删除,能拿到被删掉的元素
result = my_list7.pop(0)
print(result)
print(f"删除元素后的列表结果是:{my_list7}")

print(my_list7)
# 列表.remove(元素),按元素内容删除,只删第一个匹配项
my_list7.remove("linux")
print(f"删除元素后的列表结果是:{my_list7}")


# 列表.clear()
my_list7.clear()
print(f"清空之后的列表结果是:{my_list7}")

my_list8 = ["python","linux","python","mysql","python","hadoop","hdfs","yarn","hive"]
# len(列表)
print(len(my_list8))

十、作业

python 复制代码
#编写一个函数 sum_list,返回一个列表中所有元素的和。[1, 2, 3, 4]
lizi_list = [1, 2, 3, 4]
def sum_list(lizi_list):
    sum = 0
    for i in lizi_list:
        sum += i
    return sum
he = sum_list(lizi_list)
print(he)
python 复制代码
#编写一个函数 find_max,返回列表中的最大值。[1, 5, 3, 9, 2]
list1 = [1, 5, 3, 9, 2]
def find_max(list1):
    my_max = list1[0]
    for i in list1:
        if i>my_max:
            my_max = i
    return my_max
m = find_max(list1)
print(m)
python 复制代码
#编写一个函数 factorial,使用 while 循环计算一个数的阶乘。   5
def factorial(n):
    chushi = 1
    while n>1:
        chushi *= n
        n -= 1
    return chushi

print(factorial(5))
python 复制代码
#使用 for 循环遍历一个列表并将每个元素乘以2。[1, 2, 3, 4, 5]
list2 = [1, 2, 3, 4, 5]
list_new = []
for i in list2:
    list_new.append(i*2)
print(list_new)
python 复制代码
#编写一个函数 fibonacci,返回前n个斐波那契数。  10
def feibo(n):
    if n == 1:
        return [1]
    arr = [1,1]  ##斐波那契数列初始为1,1
    for i in range(2, n):
        arr.append(arr[-1] + arr[-2])
    return arr
print(feibo(10))
python 复制代码
#编写一个函数 remove_duplicates,去除列表中的重复元素。[1, 2, 2, 3, 4, 4, 5]
def remove_duplicates(old_list):
    new_list = []  # 用来存放去重后的新列表
    for i in old_list:
        # 新列表里还没有这个元素,才追加
        if i not in new_list:
            new_list.append(i)
    return new_list

# 测试调用
t_list = [1, 2, 2, 3, 4, 4, 5]
res = remove_duplicates(t_list)
print(res)
python 复制代码
#编写一个函数 flatten_list,将嵌套列表展开成一个单层列表。 [1, [2, 3], [4, [5, 6]], 7]
def flatten_list(let):
    flat_list = []
    for item in let:
        if isinstance(item, list):
            flat_list.extend(flatten_list(item))
        else:
            # 如果不是列表
            flat_list.append(item)
    return flat_list

print(flatten_list([1, [2, 3], [4, [5, 6]], 7]))
python 复制代码
#编写一个函数 remove_duplicates_preserve_order,从列表中删除重复项并保持原来的顺序。[1, 2, 2, 3, 4, 4, 5]
def remove_duplicates_preserve_order(xiti8):
    seen = set ()  ##定义一个集合
    new_list = []   ##定义一个空列表
    for i in xiti8:
        if i not in seen:
            new_list.append(i)
            seen.add(i)
    return new_list
print(remove_duplicates_preserve_order([1, 2, 2, 3, 4, 4, 5]))
python 复制代码
#编写一个函数 find_pairs_with_sum,在一个列表中找到所有和为指定值的数对。[1, 2, 3, 4, 5, 6];target = 7
def find_pairs_with_sum(lst,target):
    # 初始化一个空列表用于存储和为 指定值(target) 的数对
    paris = []
    # 初始化一个空集合用于存储已经遍历过的数字
    seen = set()
    # 遍历列表中的每一个数字
    for number in lst:
        # 计算补数 使得 number + a = target
        a = target - number
        # 如果补数在集合seen中,说明找到了一个和为 target 的数对
        if a in seen:
            # 将这个数对添加到 paris 中
            paris.append((a,number))
        # 将当前的数字添加到集合中,以便后续查找
        seen.add(number)
    # 返回所有数对
    return paris
print(find_pairs_with_sum([1, 2, 3, 4, 5, 6],7))
python 复制代码
#编写一个函数 longest_consecutive_sequence,找到一个列表中的最长连续子序列。[100, 4, 200, 1, 3, 2]
def longest_consecutive_sequence(lst):
    # 判断这个列表是否为空
    if not lst:
        return 0
    # 将列表转换为集合并排序,去除重复数据
    lst = sorted(set((lst)))
    print(lst)  # [1, 2, 3, 4, 100, 200]
    # 初始化最长序列长度 和 当前连续序列长度
    longest = 1
    current_streak = 1
    # 从第二个元素开始遍历
    for i in range(1,len(lst)):
        # 如果当前元素等于前一个元素 + 1 ,标识当前元素是连续的
        if lst[i] == lst[i - 1] + 1:
            current_streak += 1
        else:
            # 如果不连续,更新最长序列长度,并充值当前连续序列长度
            longest = max(longest,current_streak)
            current_streak = 1   #
    # 最后返回最长连续序列长度,确保包括最后的连续序列
    return max(longest,current_streak)


print(longest_consecutive_sequence([100, 4, 200, 1, 3, 2]))
相关推荐
-拟墨画扇-1 小时前
神经网络 | ⑬ 超参数验证:找到最佳学习超参数
深度学习·神经网络·学习
深念Y1 小时前
Windows幽灵端口占用:HNS如何无声偷走你的端口
windows·python·bug·环境·端口·特权
宸津-代码粉碎机1 小时前
Jar热部署进阶实战|修复原生方案OOM与类冲突问题,生产级无BUG优化方案
java·大数据·服务器·开发语言·前端·人工智能·python
未知违规用户3 小时前
大模型项目:RAG项目实战与FlagEmbedding模型
人工智能·windows·python·深度学习
IT小盘10 小时前
03-大模型API不只是发送Prompt-流式输出超时重试与异常处理
人工智能·python·prompt
Zzz不能停11 小时前
个人博客系统系统---测试报告【笔耕云】
python·功能测试·自动化·压力测试
一只小菜鸡..11 小时前
南京大学 操作系统 (JYY) 学习笔记:进程、系统调用与状态机管理
笔记·学习
互联网中的一颗神经元12 小时前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Wang's Blog12 小时前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang