06.计算和控制流(二)
29-代码组织:函数(def)
〉 封装一个功能
〉 定义与调用函数
〉 变量的作用域
〉 函数小技巧
封装一个功能
〉 封装
容器是对数据的封装
函数是对语句的封装
类是对方法和属性的封装
〉 函数(function)
程序中实现明确功能的代码段可以封装成一个函数,以便复用(reuse)
定义与调用函数
〉 定义函数
用def语句创建一个函数
用return关键字指定函数返回的值
def <函数名> (<参数表>):
<缩进的代码段>
return <函数返回值>
〉 调用函数
<函数名>(<参数>)
注意括号!
无返回值:<函数名>(<参数表>)
返回值赋值:v = <函数名>(<参数表>)
<function sum_list at 0x7fd72ebbe790> Sum of my list: 324
变量的作用域
〉 局部变量(LocalVariable)
在函数内部定义的参数以及变量
只在该函数定义范围内有效,函数外边无法访问到
〉 全局变量(GlobalVariable)
在函数外部定义的,作用域是整个代码段
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[6], line 8 5 num2 = 10 6 addNum(num1,num2) ----> 8 print(result) NameError: name 'result' is not defined
〉 global关键字
可以在一个函数内部得到某个全局变量的值,但是无法进行修改,Python会在函数内部创建一个同名的局部变量
使用global关键字可以在函数中改变全局变量的值
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[7], line 5 2 num1,num2 = 2,3 3 return(num1 + num2) ----> 5 addNum() 7 num1,num2 TypeError: addNum() missing 2 required positional arguments: 'num1' and 'num2'
(2, 3)
函数小技巧:map()函数
〉 有时需要对列表中每个元素做一个相同的处理,得到新列表
例如:所有数据乘以3
所有字符串转换为整数
两个列表对应值相加
〉 map(func,list1,list2….)
函数func有几个参数,后面跟几个列表
[30, 60, 120, 240, 480] [10.5, 20.25, 40.166666666666664, 80.125, 160.1]
函数小技巧:匿名函数lambda
〉 有时函数只用一次,其名称也就不重要,可以无需费神去def一个
〉 lambda表达式
返回一个匿名函数
lambda <参数表>:<表达式>
[30, 60, 120, 240, 480] [10.5, 20.25, 40.166666666666664, 80.125, 160.1] [30, 60, 120, 240, 480] [10.5, 20.25, 40.166666666666664, 80.125, 160.1]
30-代码组织:函数的参数
〉 形式参数与实际参数
〉 定义函数的参数
〉 固定参数/可变参数
〉 调用函数的参数
〉 位置参数/关键字参数
形式参数与实际参数
〉 参数:传入到函数的值
当调用含参数的函数时,这些参数的值会被复制给函数中的对应参数
〉 形式参数(parameter)
函数创建和定义过程中,函数名后面括号里的参数
〉 实际参数(argument)
函数在调用过程中传入的参数
〉 形式参数只是代表一个位置、一个变量名
〉 实际参数是一个具体内容,赋值到变量的值
3
定义函数的参数
〉 定义函数时,参数可以有两种
〉 一种是在参数表中写明参数名key的参数,固定了顺序和数量的固定参数
def func(key1, key2, key3…):
def func(key1, key2=value2…):
〉 一种是定义时还不知道会有多少参数传入的可变参数
def func(*args): #不带key的多个参数
def func(**kwargs): #key=val形式的多个参数
====func_test k1=v1,k2=v2,k3=23 k1=ab,k2=cd,k3=768 k1=K,k2=KK,k3=23
====func_test2 arg0=12 arg1=34 arg2=abcd arg3=True
====func_test3 myname=Tom sep=comma age=23
调用函数的参数
〉 调用函数的时候,可以传进两种参数
〉 一种是没有名字的位置参数
func(arg1, arg2, arg3…)会按照前后顺序对应到函数参数传入
〉 一种是带key的关键字参数
func(key1=arg1, key2=arg2…)
由于指定了key,可以不按照顺序对应
〉 如果混用,所有位置参数必须在前,关键字参数必须在后
====func_test k1=v1,k2=v2,k3=23 k1=ab,k2=cd,k3=768 k1=K,k2=KK,k3=23
31-上机练习:创建并调用函数
〉 水仙花数判定
〉 求字符集合的并集
水仙花数判定
〉 创建一个函数,接受一个参数n(n>=100),
判断这个数是否为水仙花数
水仙花数:满足如果这个数为m位数,则每个位上的数字的m次幂之和等于它本身
例如:1^3+5^3+3^3=153, 1^4+6^4+3^4+4^4=1634
〉 结果返回True或者False
〉 创建一个函数,接受一个参数max(max>=1000),调用上题编写的判断函数,求100到max之间的水仙花数
字符集合的并集
〉 创建一个函数,接受两个字符串作为参数,返回两个字符串字符集合的并集
例如:接受的两个字符串为"abc"和"bcd",返回set([‘a’, ’b’, ’c’ , ’d’])
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
32-引用扩展模块(import)
〉 调用模块化的工具
〉 Python语言标准库
〉 扩展命名空间
调用模块化的工具
〉 模块就是程序
每个扩展名为.py的Python程序都是一个独立的模块(Module)
模块能定义函数、类和变量,让你能够有逻辑地组织你的Python代码段
〉 组织模块
包(package)是放在一个文件夹里的模块集合
〉 模块引用方式
import <模块> [as <别名>]
将模块中的函数等名称导入当前程序
在调用模块中的函数的时候,需要加上模块的命名空间
可以给导入的命名空间替换一个新的名字
引用方法:<模块>.<名称>
from <模块> import <函数>
引入模块中的某个函数
调用时不需要再加上命名空间
Python语言标准库
〉 标准库
在安装Python时就默认已经安装好的模块,Python具有功能强大的标准库
〉 数字和数学模块
numbers:数字抽象基类
math:数学函数
cmath:复数的数学函数
decimal:十进制定点和浮点算术
fractions:有理数
random:生成伪随机数
statistics:数学统计功能
〉 数据类型
datetime:基本日期和时间类型
calendar:与日历相关的一般功能
collections:容器数据类型
heapq:堆队列算法
bisect:数组二分算法
array:高效的数值数组
weakref:弱引用
types:动态类型创建和内置类型的名称
copy:浅层和深层复制操作
pprint:格式化输出
reprlib:备用repr()实现
enum :支持枚举
〉 功能编程模块
itertools:为高效循环创建迭代器的函数
functools:可调用对象的高阶函数和操作
operator:标准运算符作为函数
〉 数据持久化
pickle:Python对象序列化
copyreg:注册pickle支持功能
shelve:Python对象持久化
marshal:内部Python对象序列化
dbm:与Unix“数据库”的接口
sqlite3:SQLite数据库的DB-API 2.0接口
〉 数据压缩和存档
zlib:与gzip兼容的压缩
gzip/bz2:支持gzip/bzip2文件
lzma:使用LZMA算法进行压缩
zipfile:使用ZIP存档
tarfile:读取和写入tar归档文件
〉 文件格式
csv:CSV文件读写
configparser:配置文件解析器
netrc:netrc文件处理
xdrlib:对XDR数据进行编码和解码
plistlib:生成并解析Mac OS X.plist文件
〉 文件和目录访问
pathlib:面向对象的文件系统路径
os.path:常见的路径名操作
fileinput:迭代多个输入流中的行
stat:解释stat()结果
filecmp:文件和目录比较
tempfile:生成临时文件和目录
glob:Unix样式路径名模式扩展
fnmatch:Unix文件名模式匹配
linecache:随机访问文本行
shutil:高级文件操作
macpath:Mac OS 9路径操作函数
〉 通用操作系统服务
os:其他操作系统接口
io:用于处理流的核心工具
time:时间访问和转换
argparse:用于命令行选项,参数和子命令的解析器
getopt:用于命令行选项的C风格解析器
logging:Python的日志记录工具
getpass:便携式密码输入
curses:字符单元格显示的终端处理
platform:访问底层平台的标识数据
errno:标准errno系统符号
ctypes:Python的外部函数库
〉 并发执行
threading:基于线程的并行性
multiprocessing:基于进程的并行性
concurrent.futures:启动并行任务
subprocess:子流程管理
sched:事件调度程序
queue:同步的队列类
_thread:低级线程API
〉 加密服务
hashlib:安全哈希和消息摘要算法接口
hmac:用于消息身份验证的密钥哈希算法
secrets:生成用于管理机密的安全随机数
〉 网络和进程间通信
asyncio:异步I/O
socket:低级网络接口
ssl:套接字对象的TLS/SSL包装器
select:等待I/O完成
selectors:高级I/O复用
asyncore:异步套接字处理程序
asynchat:异步套接字命令/响应处理程序
signal:设置异步事件的处理程序
mmap:内存映射文件支持
〉 互联网数据处理
email:电子邮件和MIME处理包
json:JSON编码器和解码器
mailcap:Mailcap文件处理
mailbox:以各种格式处理邮箱
mimetypes:将文件名映射到MIME类型
base64:Base16/Base32/Base64/Base85数据编码
binhex:对binhex4文件进行编码和解码
binascii:在二进制和ASCII之间转换
quopri:对MIME引用的可打印数据进行编码和解码
uu:对uuencode文件进行编码和解码
〉 互联网协议和支持
webbrowser:Web浏览器控制器
cgi:通用网关接口支持
cgitb:CGI脚本的回溯管理器
wsgiref:WSGI实用程序和参考实现
urllib:URL处理模块
http:HTTP模块ftplib/poplib/imaplib/nntplib/smtplib:FTP/POP3/IMAP4/NNTP/SMTP协议客户端
smtpd:SMTP服务器
telnetlib:Telnet客户端
socketserver:网络服务器的框架
xmlrpc:XMLRPC服务器和客户端模块
ipaddress:IPv4/IPv6操作库
〉 多媒体服务
audioop:处理原始音频数据
aifc:读写AIFF和AIFC文件
sunau:读取和写入Sun AU文件
wave:读写WAV文件
chunk:读取IFF分块数据
colorsys:颜色系统之间的转换
imghdr:确定图像的类型
sndhdr:确定声音文件的类型
ossaudiodev:访问兼容OSS的音频设备
〉 结构化标记处理工具
html:超文本标记语言支持
xml:XML处理模块
〉 程序框架
turtle — 海龟作图库
cmd —支持面向行的命令解释器
shlex —简单的词法分析
〉 图形用户界面
tkinter:Tcl/Tk的Python接口
扩展命名空间
〉 命名空间(namespace)
表示标识符(identifier)的可见范围
一个标识符可以在多个命名空间中定义,在不同命名空间中的含义互不相干
dir(<名称>)函数:列出名称的属性
help(<名称>)函数:显示参考手册
Help on built-in function time in module time: time(...) time() -> floating point number Return the current time in seconds since the Epoch. Fractions of a second may be present if the system clock provides them. 1720080723.114512