Bohrium
robot
新建

空间站广场

论文
Notebooks
比赛
课程
Apps
我的主页
我的Notebooks
我的论文库
我的足迹

我的工作空间

任务
节点
文件
数据集
镜像
项目
数据库
公开
29-32
python
python
donglikun@dp.tech
更新于 2024-07-04
推荐镜像 :Basic Image:bohrium-notebook:2023-04-07
推荐机型 :c2_m4_cpu
1
06.计算和控制流(二)
29-代码组织:函数(def)
封装一个功能
定义与调用函数
变量的作用域
函数小技巧:map()函数
函数小技巧:匿名函数lambda
30-代码组织:函数的参数
形式参数与实际参数
定义函数的参数
调用函数的参数
31-上机练习:创建并调用函数
水仙花数判定
字符集合的并集
32-引用扩展模块(import)
调用模块化的工具
Python语言标准库

06.计算和控制流(二)

代码
文本

29-代码组织:函数(def)

〉 封装一个功能

〉 定义与调用函数

〉 变量的作用域

〉 函数小技巧

代码
文本

封装一个功能

〉 封装

容器是对数据的封装

函数是对语句的封装

类是对方法和属性的封装

〉 函数(function)

程序中实现明确功能的代码段可以封装成一个函数,以便复用(reuse)

代码
文本

定义与调用函数

〉 定义函数

用def语句创建一个函数

用return关键字指定函数返回的值

def <函数名> (<参数表>):

<缩进的代码段>

return <函数返回值>

〉 调用函数

<函数名>(<参数>)

注意括号!

无返回值:<函数名>(<参数表>)

返回值赋值:v = <函数名>(<参数表>)

代码
文本
[5]
def sum_list(alist): # 定义一个带参数的函数
sum_temp = 0
for i in alist:
sum_temp += i
return sum_temp # 函数返回值

print(sum_list) # 查看函数对象

my_list = [23, 45, 67, 89, 100] # 调用函数,将返回值赋值给my_sum

my_sum = sum_list(my_list)
print("Sum of my list: %d" % my_sum)
<function sum_list at 0x7fd72ebbe790>
Sum of my list: 324
代码
文本

变量的作用域

〉 局部变量(Local￿Variable)

在函数内部定义的参数以及变量

只在该函数定义范围内有效,函数外边无法访问到

〉 全局变量(Global￿Variable)

在函数外部定义的,作用域是整个代码段

代码
文本
[6]
def addNum(num1,num2):
result = num1 + num2
return result
num1 =5
num2 = 10
addNum(num1,num2)

print(result)
---------------------------------------------------------------------------
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关键字可以在函数中改变全局变量的值

代码
文本
[7]
def addNum(num1,num2):
num1,num2 = 2,3
return(num1 + num2)

addNum()

num1,num2
---------------------------------------------------------------------------
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'
代码
文本
[8]
def addNum():
global num1,num2
num1,num2=2,3
return(num1 + num2)
addNum()

num1,num2
(2, 3)
代码
文本

函数小技巧:map()函数

〉 有时需要对列表中每个元素做一个相同的处理,得到新列表

例如:所有数据乘以3

所有字符串转换为整数

两个列表对应值相加

〉 map(func,list1,list2….)

函数func有几个参数,后面跟几个列表

代码
文本
[11]
num=[10,20,40,80,160]
lst=[2,4,6,8,10]

def mul3(a):
return a * 3
print(list( map(mul3,num)))

def atob(a,b):
return a + 1.0/b
print(list( map(atob,num,lst)))
[30, 60, 120, 240, 480]
[10.5, 20.25, 40.166666666666664, 80.125, 160.1]
代码
文本

函数小技巧:匿名函数lambda

〉 有时函数只用一次,其名称也就不重要,可以无需费神去def一个

〉 lambda表达式

返回一个匿名函数

lambda <参数表>:<表达式>

代码
文本
[13]
num=[10,20,40,80,160]
lst=[2,4,6,8,10]

def mul3(a):
return a*3
print(list(map(mul3,num)))

def atob(a,b):
return a + 1.0/b
print(list(map(atob,num,lst)))

print(list(map(lambda a:a *3,num)))
print(list(map(lambda a,b:a+1.0/b,num,lst)))
[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)

函数在调用过程中传入的参数

〉 形式参数只是代表一个位置、一个变量名

〉 实际参数是一个具体内容,赋值到变量的值

代码
文本
[14]
def add(a,b):
return a + b

add(1,2)
3
代码
文本

定义函数的参数

〉 定义函数时,参数可以有两种

〉 一种是在参数表中写明参数名key的参数,固定了顺序和数量的固定参数

def func(key1, key2, key3…):

def func(key1, key2=value2…):

〉 一种是定义时还不知道会有多少参数传入的可变参数

def func(*args): #不带key的多个参数

def func(**kwargs): #key=val形式的多个参数

代码
文本
[22]
# 固定参数
def func_test(key1, key2, key3=23):
print("k1=%s,k2=%s,k3=%s" % (key1,key2,key3))

print("====func_test")
func_test('v1','v2')# 没有传入key3,用了缺省值
func_test('ab','cd',768)#传入了key3
func_test(key2='KK', key1='K')# 使用参数名称就可以不管顺序
====func_test
k1=v1,k2=v2,k3=23
k1=ab,k2=cd,k3=768
k1=K,k2=KK,k3=23
代码
文本
[16]
# 可变参数

def func_test2(*args):
for arg,i in zip(args,range(len(args))):
print("arg%d=%s" % (i,arg))
print("====func_test2")
func_test2(12,34,'abcd',True)
====func_test2
arg0=12
arg1=34
arg2=abcd
arg3=True
代码
文本
[17]
# 可变参数

def func_test3(**kwargs):
for key, val in kwargs.items():
print("%s=%s" % (key,val))

print("====func_test3")
func_test3(myname="Tom",sep="comma",age=23)
====func_test3
myname=Tom
sep=comma
age=23
代码
文本

调用函数的参数

〉 调用函数的时候,可以传进两种参数

〉 一种是没有名字的位置参数

func(arg1, arg2, arg3…)会按照前后顺序对应到函数参数传入

〉 一种是带key的关键字参数

func(key1=arg1, key2=arg2…)

由于指定了key,可以不按照顺序对应

〉 如果混用,所有位置参数必须在前,关键字参数必须在后

代码
文本
[19]
#位置参数/关键字参数

def func_test(key1,key2,key3=23):
print("k1=%s,k2=%s,k3=%s"%(key1, key2, key3))
print('====func_test') # 没有传入key3,用了缺省值
func_test('v1','v2')#传入了key3
func_test('ab','cd',768)# 使用参数名称就可以不管顺序
func_test(key2='KK',key1='K')
====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之间的水仙花数

代码
文本
[ ]
#上机练习1:

代码
文本

字符集合的并集

〉 创建一个函数,接受两个字符串作为参数,返回两个字符串字符集合的并集

例如:接受的两个字符串为"abc"和"bcd",返回set([‘a’, ’b’, ’c’ , ’d’])

代码
文本
[23]
#上机练习2:

(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(<名称>)函数:显示参考手册

代码
文本
[24]
import time
dir(time)

time.tzname

help(time.time)

print(time.time())
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
代码
文本
python
python
点个赞吧
推荐阅读
公开
未命名
《计算材料学》组队共读
《计算材料学》组队共读
ddr
发布于 2024-03-11
公开
16入门Python实用技巧
python
python
xiangs@dp.tech
发布于 2023-11-12
2 赞