Python 入门 到 精通 (四)

  • 函数基本知识
  • 递归函数
  • Lambda(匿名函数)
  • 实例运用

本篇文章重点讲解 Python 函数 的以下内容:

定义函数语法、调用函数、函数参数、参数的传递方式、参数的类型、可变参数、函数的返回值、函数说明文档、作用域 。

大家也可参照我的另一篇博客,是有关python函数的拓展,有关本章的匿名函数,在这篇文章也有深入解析:Python 之 高阶函数

函数基本知识

函数定义语法:

         def   函数名(参数):'''函数文档说明'''函数体return 返回值eg:定义两个数求和的函数def  sum(a,b):return a+b

注意:必须先定义函数,然后再调用该函数

函数调用:

         直接使用函数名,再跟上参数的值即可。eg:#调用上面定义好的函数sumresult=sum(1,2)结果为:result为3

函数参数:

         情况1:函数定义的参数的个数必须和调用函数传入的值个数保持一致情况2:如果指定了函数的参数,在调用函数的时候,没有传入相对应的值,则会出错情况3:在没有传入函数值的情况下,可以对函数参数设置默认值eg:#在定义函数时候,指定参数的默认值def  sum(a=1,b=1):return  a+b#调用函数,传递参数sum(2,3):有参数传递,结果为5sum():没有参数传递,结果为2

函数参数的传递方式:

         方式1:位置参数,以正确的顺序传入函数,调用时的数量必须和声明时一样方式2:关键字参数,允许函数调用时参数的顺序和声明时不一致#位置参数sum(1,2):调用后a=1,b=2#关键字参数sum(b=1,a=2),调用后a=2,b=1

函数参数类型:

         在Python函数中,参数的类型可以是任意类型eg:#定义函数def   test(a):#调用函数a可以为任意类型,可以为number,也可以为String,可以为List、Tuple、set、Dictionary都可以

函数可变参数:

在某些情况下,函数的参数的个数是不固定的。可以传入参数,也可以选择不传递参数,可以传递一个参数,也可以传递多个,参数为元组类型或字典类型,语法格式:

         def   函数名(*参数名):eg:求多个值的和def  sum(*a):sum=0for   i   in  a:sum+=ireturn sum

函数返回值:

         语法:return  结果注意:返回结果可以是一个值、多个值,也可以是另外一个函数def sum(*a):sum=0for i in a:sum+=idef dayin():print(f"计算的结果为:{sum}")return dayin()sum(1,2,3)

函数的说明文档:

类似Java中的每个方法都会有个说明,说明该方法的作用,在Python函数中,定义函数说明格式如下:

         在函数的第一行写上:'''函数文档说明'''eg:def    sum(a,b):'''这是一个求两个数之和的函数参数有两个'''return  a+b查看可以使用help()函数,比如查看sum()help(sum)

作用域:

变量的作用域分为两种:

  • 全局作用域

  • 函数作用域

全局作用域 :不能调用函数作用域中的变量,但是函数作用域可以调用全局作用域中的变量;

若在函数作用域中修改全局作用域中的值,必须使用global 声明

         eg:a=1   #全局作用域def   sum():b=2   #局部作用域global  a  #声明a为全局作用域a=2   #直接改a的值会出错

递归函数

递归:函数内部调用函数本身

         # 求某个数以内的和def test(num):if num == 1:return 1return num + test(num - 1)# 调用递归函数print(test(100)) # 5050

Lambda(匿名函数)

匿名函数:如果函数有一个返回值,并且只有一句代码,可以用lambda简化

lambda 表达式:

         语法:变量名 = lambda 参数列表 : 表达式/返回值     注意:参数可以省略参数形式:无参数一个参数默认参数可变参数:*args 、**kwargs带判断的lambda:返回值中使用三元运算符列表内字段数据进行排序的语法:列表.sort(key = lambda x:x['排序的列'])列表.sort(key = lambda x:x['排序的列'],reverse=True)

本章代码:

             # 函数:sa = """定义函数:语法:deg 函数名():代码调用函数:语法:函数名()注意:在Python中,函数必须先定义,后调用"""print(sa)def say():print("俺正在说话")#  使用lambda表达式简化上面函数say = lambda: "俺再一次说话"# print(say())sb = """函数参数:语法:def 函数名(参数名1,参数名2):代码调用有参函数:语法:参数名(参数值1,参数值2)注意:形参:参数名1,参数名2实参:参数值1,参数值2"""print(sb)# 带参数的函数def eat(what):print(f"你们正在吃{what}")eat = lambda what: f"你们正在吃{what}"# print(eat("螺蛳粉"))sc = """参数的传递方式:1、位置参数调用函数时根据函数定义的参数位置来传递参数注意:传递和定义参数的顺序、个数必须一致2、关键字参数函数调用,通过“键=值” 形式加以指定3、缺省参数默认参数,用于定义函数时,为参数提供默认值,调用函数时可不传该默认参数的值4、不定长参数(可变参数)包裹位置传递语法:def 函数名(*args):代码包裹关键字传递语法:def 函数名(**kwargs):代码"""print(sc)# 定义带两个参数的函数def test(a, b=222):print(f"a={a}")print(f"b={b}")test = lambda a,b=222: f"a={a},b={b}"# print(test(111))# 带条件的lambdatest7 = lambda a,b : a if a > b else bprint(test7(22, 44))# 求1,2,3内的和,用lambda实现test8 = lambda *args: sum(args)# print(test8(1, 2, 3))# 定义可变参数1,参数是元组类型# 多个值的和def test1(*args):"""这是一个求多个值和的函数"""sum = 0for i in args[0]:sum += ielse:# print(f"和为{sum}")#         返回值return sum#  定义可变参数2:# 参数为字典类型def test2(**kwargs):for k, v in kwargs.items():print(k, v)# 返回值为多个def test3(a, b, c):"""这是一个测试函数,测试函数为多个返回值:param a: 值1:param b: 值2:param c: 值3:return: 返回多个值"""a += 100b += 100c += 100return a, b, c# 计算多个值的平均值def test4(*args):sum = test1(args)return sum / len(args)# 测试变量范围a = 222  # 全局变量def test5():# 在函数内部修改全局变量的值# 必须声明 变量为全局变量global aa = 333print(f"函数内:{a},地址为:{id(a)}")# 递归:函数内部调用函数本身# 求某个数以内的和def test6(num):if num == 1:return 1return num + test6(num - 1)# 调用递归函数# print(test6(100))# print(f"函数外:{a},地址为:{id(a)}")# test5()# print(f"函数外:{a},地址为:{id(a)}")# 调用函数:必须放在定义函数的后面# say()# 调用有参的函数# eat("辣椒炒尖椒")# 调用参数:1.位置方式# test(11, 22)# 2.关键字方式# test(b=22, a=11)# 3.缺省参数(默认值)# 注意:有默认值的参数必须放在没有默认值参数的后面# test(11, 22)# 调用可变参数1# print(test1(1, 2, 3))# 调用可变参数2# test2(name="罗旺", age=19)# 调用返回值为多个值的函数# print(test3(20, 10, 30))# 查看函数的说明文档# help(test3)# 函数嵌套# print(test4(1, 2, 3))# 使用lambda对字典列表进行排序persons = [{"name": "张三", "age": 22},{"name": "A罗旺", "age": 12},{"name": "王五", "age": 23},{"name": "赵六", "age": 2}]persons.sort(key= lambda person:person["name"], reverse=True)print(persons)

实例运用

             """需求:员工管理系统功能:1.添加员工信息2.删除员工信息3.修改员工信息4.查看单个员工信息5.查看所有员工信息6.退出技术:函数、数据类型(字典列表)、循环、条件语句"""emps = [{"id": "001", "name": "魏无羡", "gender": "男", "age": "19"},{"id": "002", "name": "蓝忘机", "gender": "男", "age": "20"},{"id": "003", "name": "江晚吟", "gender": "男", "age": "19"}]"""选择功能列表"""def chocieFunc():print("*" * 30)print("\t^V^  1.添加员工信息")print("\t^V^  2.删除员工信息")print("\t^V^  3.修改员工信息")print("\t^V^  4.查看单个员工信息")print("\t^V^  5.查看所有员工信息")print("\t^V^  6.退出")print("*" * 30)"""添加员工信息"""def addEmp():id = input("\n\t\t\t\t请输入要添加的员工编号:")name = input("\n\t\t\t\t请输入要添加的员工姓名:")gender = input("\n\t\t\t\t请输入要添加的员工性别:")age = input("\n\t\t\t\t请输入要添加的员工年龄:")emp = {"id": id, "name": name, "gender": gender, "age": age}emps.append(emp)print("\n\t\t\t\t添加OK  ^V^ !\n")"""删除员工信息"""def delEmp():id = input("\n\t\t\t\t请输入要删除的员工编号:")for emp in emps:if emp.get("id") == id:# 将emp删除,从empsemps.remove(emp)print("\n\t\t\t\t删除OK  ^V^ !\n")breakelse:print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")"""修改员工信息"""def updateEmp():id = input("请输入要修改的员工编号:")for emp in emps:if emp["id"] == id:# 特别注意emp["name"] = input(f"\n\t\t\t\t请输入要修改后的员工姓名(原来姓名:{emp['name']}):")emp["gender"] = input(f"\n\t\t\t\t请输入要修改后的员工性别(原来性别:{emp['gender']}):")emp["age"] = input(f"\n\t\t\t\t请输入要修改后的员工年龄(原来年龄:{emp['age']}):")# emp = {"id": id, "name": name, "gender": gender, "age": age}# 先删除原有的emp,在追加新的emp【不推荐】print("\n\t\t\t\t修改成功  ^V^ !!!\n")breakelse:print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")"""查看单个员工信息"""def getEmpById():id = input("\n\t\t\t\t请输入要查询的员工编号:")for emp in emps:if emp["id"] == id:print("\n\t\t\t\t编号\t姓名\t性别\t年龄")print(f"\n\t\t\t\t{emp['id']}\t\t{emp['name']}\t {emp['gender']}\t\t{emp['age']}\n")breakelse:print("\n\t\t\t\t查无此人,请输入正确的员工编号!!\n")"""查看所有员工信息"""def getAllEmps():print("\n\t\t\t\t编号\t姓名\t性别\t年龄")for emp in emps:print(f"\n\t\t\t\t{emp['id']}\t\t{emp['name']}\t {emp['gender']}\t\t{emp['age']}")else:print(f"\n\t\t\t\t共查询到{len(emps)}条数据\n")print("\n\t\t******欢迎使用员工管理系统******")while True:chocieFunc()num = int(input("\n\t\t请输入指令:"))if num == 1:addEmp()elif num == 2:delEmp()elif num == 3:updateEmp()elif num == 4:getEmpById()elif num == 5:getAllEmps()elif num == 6:print("\n\t\t\t\t\t\t\t\t    ^V^  欢迎下次再来  ^V^ ")breakelse:print("\n\t\t请输入正确的指令")

Python 入门 之 函数相关推荐

  1. python入门之函数结构函数的参数_python3基础之函数参数类型

    函数的参数是函数内部与外部交流的纽带,上一篇文章我们使用了最简单的参数形式(就一个参数).接下来测试一下多个参数的情况是怎样的? 1.测试1 例子中使用了两个参数p1和p2, 函数的功能就是打印出p1 ...

  2. python入门day16——函数的递归调用、二分法、三元表达式、匿名函数

    文章目录 函数的递归调用 递归调用应该分为两个阶段 二分法 三元表达式 匿名函数 函数的递归调用 函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用自己 示例1:直接调用自己 def foo ...

  3. Python入门之函数结构——第3关:函数的使用范围:Python作用域

    任务描述 函数是有使用范围的,在一个模块中,我们可以定义很多函数和变量,但我们希望有的函数和变量别人可以使用,有的函数和变量仅仅可以在模块内部使用.这就是Python作用域的相关问题. 本关的目标就是 ...

  4. python 入门 guess 函数

    猜年龄限制次数,使用while函数和count计数器. age_of_spencer = 28 count = 0 while True:if count == 2:breakage = int(in ...

  5. python入门——全局函数思维导图

    全局函数的具体使用方法在这里

  6. python入门之函数结构函数的参数_Python 基础之函数初识与函数参数

    一.函数初识 定义:满足某一个方法 满足某一个功能#(1)功能(包裹一部分代码 实现某一个功能 达成某一个目的)#(2)可以反复调用,提高代码的复用性,提高开发效率,便于维护管理#(3)函数的基本格式 ...

  7. python入门——常用函数总结

    一.输入输出函数 1.print()函数 #输出指定的内容 print('hello world')#可以同时输出多个字符串,用逗号','隔开 print('hello','how','are')#可 ...

  8. python3.7.4-Python3.7.4入门-3函数

    3 函数 3.1 定义函数 def fib(n): # write Fibonacci series up to n """Print a Fibonacci serie ...

  9. Python入门篇-匿名函数

    Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...

最新文章

  1. 服务器定期巡检项目,服务器定期巡检制度..docx
  2. 2018/Province_Java_C/1/哪天返回
  3. OData Console in C4C and Gateway Client in CRM Fiori
  4. sed之G、H、g、h使用
  5. 智能车学习(八)——菜单的实现
  6. can和could的用法_can和could的区别和用法
  7. 红孩儿编辑器的详细设计第二部分
  8. 加油站会员管理系统用什么好
  9. Defcon 2019 Qualify: redacted puzzle Writeup
  10. 浅析人工智能体系建设
  11. 被吹爆的性能强者FastAPI,实际性能不到Flask一半
  12. 转换字符串中数字为整数
  13. Android开发者编写自己的API接口(下)
  14. python开发酷q插件_基于python和酷Q的QQ机器人开发实践(1)
  15. 服务器入侵之找出隐藏字符的原理
  16. Java零基础到传奇的必经之路,你准备好了吗?
  17. 985博士生盲审未过!学界泰斗喊冤后决定带他去港科大重读博士?
  18. 路由器回流--内网不能访问网站的问题
  19. python png转jpg
  20. 管理员宝典:迷死人不偿命的开源工具

热门文章

  1. 【论文阅读|深读】DANE:Deep Attributed Network Embedding
  2. 【公告】MD毛豆新发现新域名注册成功了_彭世瑜_新浪博客
  3. Symantec AntiVirus 9.0 Corporate Edition Client 病毒库更新下载
  4. 缓慢的HTTP拒绝服务攻击漏洞验证
  5. JavaScript--【JS】基础语法
  6. 浅谈Android模块化设计(模块化的一些思考)
  7. 水货还是行货?相机怎么买才能让人放心
  8. php 两表关联查询,Thinkphp连多表查询,关联2个或多个字段
  9. 信号处理——Hilbert端点效应浅析
  10. 【Pregel+】Pregel+安装配置及使用教程