零基础学 Python(2023 版)
尹会生
太乙人工智能技术合伙人 & 项目总监
60050 人已学习
新⼈⾸单¥68
课程目录
已完结/共 124 讲
结束语 & 结课测试 (2讲)
零基础学 Python(2023 版)
登录|注册
留言
6
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 57|再回首:“函数”单元小结
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程介绍:这次我们都做了哪些升级?
内容综述:明确学习目的
01|如何配置 Python 开发环境?
02 | 常用 IDE:如何提高开发效率?
03 | 如何站在官方文档的肩膀上自己“造轮子”?
04 | 怎样运行你的第一行代码?
05 | 怎样使用 Gitee 管理你的代码?
06 | 学习编程有问题?去这里找答案!
07|跨越门槛:Python 开发环境总结及实现原理
08 | 修炼基本功:浅析输入输出
09 | 变量:如何让计算机临时存储数据?
10|字符串(上):Python 是如何处理单词的?
11|字符串(下):Python 是如何处理单词的?
12|存储数字应该采用哪种数据类型?
13|何时使用数,何时使用字符串?
14|注释:如何写程序的说明书?
15|小试牛刀:如何制作简单计算器?
16|变量命名规范:如何编写优雅的程序?
17|告别新手村:Python 编程基础知识
18|内置数据类型包括哪几种?
19|列表如何处理同类数据?
20|常见常新:列表的常见操作
21|元组:如何处理一次性数据?
22|常见常新:集合的常见操作
23|字典:如何处理映射类型的数据?
24|常见常新:字典的常见操作(上)
25|常见常新:字典的常见操作(下)
26|小试牛刀:如何利用类型转换实现手机通讯录?(上)
27|小试牛刀:如何利用类型转换实现手机通讯录?(下)
28|常见的内置数据类型都何时使用?
29|避坑指南:内置数据类型的常见错误
30|内置数据类型参考:如何使用官方文档与帮助?
31|再回首:“内置数据类型”单元小结
32|if 语句:数据流程出现分支时,怎样编写程序?
33|match 语句:如何通过 match 关键字来处理程序的分支逻辑?
34|while 循环:需要多次重复执行某段程序时,怎么做?
35|for 循环:如何遍历一个对象里的所有元素?
36|语句嵌套:如何处理多重循环的问题?
37|小试牛刀:如何设计一个飞机大战的程序?
38|避坑指南:判断和循环中的常见错误
39|再回首:“判断循环”单元小结
40|输入:如何接收用户通过键盘输入的数据?
41|格式化输出:如何将执行结果通过屏幕输出?
42|F-strings:如何通过定义好的格式进行输出?
43 | 常见常新:文件的打开
44|文件编码:如何解决不同操作系统的文件乱码问题?
45|常见常新:文件的读写
46|常见常新:文件的关闭
47|小试牛刀:如何使用 Python 合并多个文件?
48|再回首:“输入输出与文件操作”单元小结
49|函数的定义:如何优雅地反复引用同一段代码?
50|函数的参数:怎样实现函数与外部数据通信?
51|函数的参数:当函数操作对象不固定时怎么处理?
52|函数的返回值:如何得到函数的执行结果?
53|小试牛刀:如何利用函数实现电商购物车功能?
54|避坑指南:列表作为参数传递出错了怎么办?
55|高阶函数:函数对象与函数调用的用法区别
56|装饰器:函数嵌套的定义与调用的区别
57|再回首:“函数”单元小结
58|编程思想不同会导致怎样的代码差异?
59|类与实例:如何使用面向对象的思想编写程序?
60|类的继承:如何解决代码重用的问题?
61|类的装饰器:如何改变类方法的功能?
62|小试牛刀:如何开发自动咖啡机?
63|避坑指南:类的常见错误
64|init 方法:如何为对象传递参数?
65|再回首:“类”单元小结
66 | 模块的导入:如何使用其他人编写好的代码功能?
67 | 标准库:Python 默认提供的便捷功能有哪些?
68 | 自定义模块:如何编写一个完整功能?
69 | 第三方模块的使用:如何使用其他人编写的代码?
70 | 小试牛刀:如何使用 Python 为函数求导?
71|再回首:“模块与标准库”单元小结
72|初识异常:异常的产生与分类
73|异常捕获:出现异常时,如何利用程序进行处理?
74|自定义异常捕获:如何定义业务异常?
75|避坑指南:编写捕获异常程序时经常出现的问题
76|再回首:“异常处理”单元小结
77|扩展数据类型:怎样使用更复杂的数据类型?
78|魔术方法:怎样通过类构造自己需要的数据类型?
79|怎样将 Python 和 C++ 结合起来混合编程?
80|怎样将已有算法改造成符合项目的特定算法?
81|设计模式:怎样合理组合多个函数和类?
82|Redis 数据库:怎样使用 NoSQL 数据库?
83|关系型数据库:怎样使用关系型数据库?
84|计算资源充足时,如何通过并行设计提高效率?
85|多进程间如何通信?
86|再回首:“高级数据类型与算法”单元小结
87|理论盘点:数据分析的流程及对应的 Python 库
88|理论盘点:数据采集的方法与 HTTP 协议
89|理论盘点:任务的并行执行原理
90|理论盘点:非规范化数据处理的基础与正则表达式
91|如何获取网页上的数据并存储到文件?
92|小试牛刀:如何将数据进行图形化展示?
93|再回首:“数据分析”单元小结
94|理论盘点:文件类型与对应的 Python 函数库
95|如何批量读取 Excel 文件?
96|如何实现数据的批量格式转换?
97|如何扩展数据类型?
98|再回首:“办公自动化”单元小结
99|理论盘点:Web 客户端与服务端
100|理论盘点:MVC 模型是什么?
101|如何使用Django搭建简单的Web服务器?
102|如何使用Django-admin实现文章上传?
103|如何使用Django实现文章发布?
104|再回首:“Web开发”单元小结
105|理论盘点:人脸识别的一般步骤
106|理论盘点:人脸识别常用的 Python 库有哪些?
107|怎样通过 OpenCV 采集视频信号?
108|如何训练人脸模型?
109|怎样设计人脸识别系统?
110|再回首:“计算机视觉”单元小结
111|聚焦异同:物联网与互联网有啥不一样?
112|理论盘点:基础但不简单的 TCP 协议
113|理论盘点:物模型与模组
114|如何为 ESP32 安装 MicroPython?
115|怎样通过 MQTT 协议构建消息队列?
116|小试牛刀:在 OLED 屏幕和手机远程同时显示室内温度
117|再回首:“物联网”单元小结
118|结束语:人生苦短,我用Pyhon
结课测试|来赴一场满分之约吧!
直播加餐|与AI共同编程,用ChatGPT学Python
直播加餐|用OpenAI API理解Python数据类型
直播加餐|掌握Gradio框架:为 AI Agent 程序定制界面
本节摘要

你好,我是尹会生。

这一章我带你学习了 Python 中一个非常重要的概念——函数。当一段程序有了函数之后,它的复杂度和灵活性都会随之升高。所以函数既是门槛又是台阶,掌握了函数,你就可以编写日常大多数的程序了。

对于初学编程的你来说,函数可以改变你对程序是自上而下执行的认知,它的执行顺序变为从函数引用到函数体的过程,且稍微大型的程序还会涉及从函数体里再去调用另一个函数的问题。这就让很多同学产生了一系列问题:哪些代码应该被定义为一个函数,哪些代码应该被定义为多个函数,程序写出来很快就忘记了参数的数量和类型了,每次都要重读一遍代码,怎样维护函数等等。

所以这节课,我想从函数的定义与调用、函数的参数与返回值来为你总结一下如何定义好一个函数,帮你更快掌握在 Python 程序中使用函数的方法。

函数的定义与调用

我先来带你复习一下函数的定义。

函数是一段具有特定功能的、可重复使用的代码段。它的写法是使用 def 关键字后跟着函数的名称、参数,并利用缩进组合了多行代码,形成的一个代码片段。

如果把编写整个程序比喻成制作一块蛋糕,那么函数就是制作蛋糕的每一个步骤。如果说做蛋糕的每一个步骤是把采用不同的原材料看作明确的分界线的话,那么对比之下代码就要困难得多。因为编写一个完整的程序,它的功能是相互依赖的,我们称作“耦合”。

登录 后留言

全部留言(6)

  • 最新
  • 精选
yanyu-xin
from typing import NewType # 新建 UserId 类型 UserId = NewType('UserId', int) # 新建 Password 类型 UserPassword = NewType('UserPassword', str) # 新建 Protocol 类型 Protocol = NewType('Protocol', dict) def connect(ip:UserId, name=None:str, password=None:UserPassword, ports=None:int, keyt=None:int, http=None:Protocol, https=None:Protocol) -> bool : # 逐一判断输入参数 if agr_ok(ip, name, password, ports, keyt, http, https) : # 逐一连接服务器 if connect_ok(ip:UserId, name, password, ports, keyt, http, https) : return True return False def connect_ok(ip:UserId, name:str, password:UserPassword, ports:int, keyt:int, http:Protocol, https:Protocol) -> bool : ''' 逐一连接服务器''' if connect_1(ip, name, password, http) : return True if connect_2(ip, name, password, https) : return True if connect_3(ip, keyt, http) : return True if connect_4(ip, keyt, https) : return True if connect_5(ip, ports, name, password, http): return True if connect_6(ip, ports, name, password, https): return True if connect_7(ip, ports, keyt, http): return True if connect_8(ip, ports, keyt, https): return True return False def agr_ok(ip:UserId, name:str, password:UserPassword, ports:int, keyt:int, http:Protocol, https:Protocol) -> bool : ''' 逐一判断输入参数的格式''' if is_ip(ip) and \ is_name(name) and \ is_password(password) and \ is_ports(ports) and \ is_keyt(keyt) and \ is_https(https) and \ is_https(http) : return True return False
2023-02-09
3
MarkG
# IP 地址是必填项 当为第一个固定参数 # 用户密码 和 密钥 存在一个就行 使用位置参数 # http协议 https协议 存在一个就行 使用自定义参数 # 端口非默认的,http默认端口80,https默认端口443 使用自定义参数 def connect(ip_address: str, *auth_key, protocal="http", port=80): # 检测授权 if len(auth_key) == 1: print("填入的是密钥") elif len(auth_key) == 2: print("填入的是用户密码") # 协议处理 if protocal == "https" and port == 80: port = 443 print(f"服务器地址:{protocal}://{ip_address}:{port} 权限:{auth_key}") connect("12.13.22.1", 'username', 'password') connect("12.13.22.1", 'username', 'password', protocal="https") connect("12.13.22.1", 'secretkey') connect("12.13.22.1", 'secretkey', protocal="https") 输出如下: 填入的是用户密码 服务器地址:http://12.13.22.1:80 权限:('username', 'password') 填入的是用户密码 服务器地址:https://12.13.22.1:443 权限:('username', 'password') 填入的是密钥 服务器地址:http://12.13.22.1:80 权限:('secretkey',) 填入的是密钥 服务器地址:https://12.13.22.1:443 权限:('secretkey',)
2023-10-10
2
Geek_0c747b
根据你的需求,我设计了一个 `connect()` 函数,它可以接受多种参数组合来连接服务器。这个函数使用了 Python 的可选参数和默认参数,以便在不同的情况下提供不同的参数。 ```python def connect(ip_address: str, protocol: str, port: int = None, username: str = None, password: str = None, key: str = None): if username and password: print(f"Connecting to {ip_address} using {protocol} with username {username} and password {password}") elif key: print(f"Connecting to {ip_address} using {protocol} with key {key}") else: print("Invalid parameters") if port: print(f"Port: {port}") ``` 在这个函数中,`ip_address` 和 `protocol` 是必需的参数,因为无论如何都需要它们来连接服务器。`port`、`username`、`password` 和 `key` 是可选的参数,可以根据需要提供。如果提供了 `username` 和 `password`,那么函数会使用它们来连接服务器。如果提供了 `key`,那么函数会使用它来连接服务器。如果既没有提供 `username` 和 `password`,也没有提供 `key`,那么函数会打印一条错误消息。 请注意,这个函数只是一个示例,它并没有实际连接到服务器。在实际使用中,你需要替换 `print()` 语句,以执行实际的连接操作。 .
2023-12-07
1
李云龙
分享我的答案: def connect(ip:str, port = 0, usr="", passwd="", isHttp = False, isHttps = False, keys="") -> bool: """ 根据参数个数进行拆分, 调用子函数进行连接。 这里假设所有的子函数连接均执行成功 参数的合法性检查延后至子函数中""" if ip == "": print("Please enter an IP address") return False param_cnt = 0 if port != 0: param_cnt += 1 if usr != "": param_cnt += 1 if passwd != "": param_cnt += 1 if isHttp: param_cnt += 1 if isHttps: param_cnt += 1 if keys != "": param_cnt += 1 if isHttp: match param_cnt: case 5: print("No.5 subfunction is called") return True case 4: if usr != "": print("No.1 subfunction is called") return True else: print("No.7 subfunction is called") return True case 3: print("No.3 subfunction is called") return True case _: print("parameter number error") return False else: match param_cnt: case 5: print("No.6 subfunction is called") return True case 4: if usr != "": print("No.2 subfunction is called") return True else: print("No.8 subfunction is called") return True case 3: print("No.4 subfunction is called") return True case _: print("parameter number error") return False
2024-02-18
760418
学习了,谢谢老师
2023-11-29
依托答辩
@wraps(func)干嘛用的,好像不加这一句,代码也完整啊
2023-11-27
收起评论