Day 10 函数与模块
今日内容
- 文件修改的两种方式
- 函数
- 模块
文件操作
文件修改的两种方式
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
1.
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
eg.
with open('test.txt',mode='rt',encoding='utf-8') as f: # 先将test.txt加载到内存打开
data = f.read() # 将test.txt中的内容赋值
with open('test.txt',mode='wt',encoding='utf-8') as f: # 只写模式打开原文件,里面内容被清空
f.write(data.replace('koala','KOALA')) # 一次性将修改好的data写入test.txt
2.
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
eg.
import os
with open('test.txt',mode='rt',encoding='utf-8') as f1,\
open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('KOALA',"koala"))
os.remove('test.txt')
os.rename('.test.txt.swp','test.txt')
函数
函数的概念
什么是函数?
函数就是盛放功能(一系列代码)的容器
定义函数就是造出了一个工具:
事先准备工具的过程->函数的定义
遇到应用场景拿来就用->函数的调用
为什么使用函数?
1.为了使程序的组织结构清晰,可读性强,可维护性强
2.函数的可扩展性强
函数的使用
使用的原则
先定义,后使用
函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名
函数的使用,必须遵循原则:先定义,后调用
我们在使用函数时,一定要明确地区分定义阶段和调用阶段:定义阶段仅检查语法错误,不执行代码
函数的定义与调用
语法:
先定义:
# 函数名要能反映其意义
def 函数名(参数1,参数2,参数3,...):
代码1
代码2
代码3
return 值
后调用
res = 函数名(值1,值2,值3)
eg.
def func():
print("*" * 40)
print("hello".center(40, ' '))
print('=' * 40)
print(func)
>>> <function func at 0x000001F272B5D280> # func = 函数的内存地址
f = func
f()
>>> ****************************************
hello
========================================
函数的参数
1、无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
eg.
def func(): # 定义时没有参数
print("*" * 40)
print("hello".center(40, ' '))
print('=' * 40)
f() # 调用时只打印函数内的操作
>>> ****************************************
hello
========================================
定义时无参,意味着调用时也无需传入参数
2、有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
eg.
def add(x,y): # 定义部分
res = x + y
print(res)
add(1,2) # 调用时输入参数
>>>3
定义时有参,意味着调用时则必须传入参数
3、空函数:设计代码结构
函数的返回值
什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
没有return或者return无值或者return None:返回的都是None
return 1个值->返回1个值 返回的就是改值本身
return 逗号分隔多个值->元组
返回值的语法:
函数内可以有多个return,但只要执行一次,整个函数就立即结束,并且将return后的值当作本次调用的产品返回
模块
模块的概念
什么是模块?
模块一系列功能的集合体
为什么要用模块?
1.从文件级别组织程序,更方便管理
2.拿来主义,提升开发效率
3.减少代码冗余
模块的类别
模块分为四种通用的类别:
1 使用python编写的.py文件
2 已被编译为共享库或DLL的C或C++扩展
3 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4 使用C编写并链接到python解释器的内置模块
模块的来源
- python自带的模块/库
1.内置模块
2.标准库 - 第三方的库
- 自定义库
使用模块之import
import
eg.
import spam
print(spam.name) # koala
spam.f1() # f1
spam.f2() # f2
def f1():
print('xxxxxxxx')
spam.f1() #f1
from...import
eg.
from spam import name,f1,f2
print(name)
f1()
f2()
def f1(): # 与之前名字冲突
print('xxxxxxxx')
f1() # xxxxxxx
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀spam.
from...import...的方式有好处也有坏处
好处:使用起来方便了
坏处:容易与当前执行文件中的名字冲突
常用模块
time模块
import time
# 以当前时间为准,三种形式的时间
print(time.time()) # 时间戳:1623241679.1426463
print(time.strftime("%Y-%m-%d %X")) #格式化的时间字符串:2021-06-09 20:27:59
print(time.localtime()) # 本地时区的struct_time
>>>time.struct_time(tm_year=2021, tm_mon=6, tm_mday=9, tm_hour=20, tm_min=27, tm_sec=59, tm_wday=2, tm_yday=160, tm_isdst=0)
print(time.gmtime()) # UTC时区的struct_time
>>>time.struct_time(tm_year=2021, tm_mon=6, tm_mday=9, tm_hour=12, tm_min=27, tm_sec=59, tm_wday=2, tm_yday=160, tm_isdst=0)
random模块
import random
print(random.random()) # (0,1)----float 大于0且小于1之间的小数
print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数
print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数
print(random.choice([1,'23',[4,5]])) # 1或者23或者[4,5]
print(random.sample([1,'23',[4,5]],2)) # 列表元素任意2个组合
print(random.uniform(1,3)) # 大于1小于3的小数,如1.927109612082716
item=[1,3,5,7,9]
random.shuffle(item) # 打乱item的顺序,相当于"洗牌"
print(item)
eg.生成随机验证码
import random
def make_code(size): # 定义一个函数
res = ''
for i in range(size):
num = str(random.randint(0,9)) # 0-9取随机数
s = chr(random.randint(65,90)) # A-Z取随机数
res += random.choice([num,s])
return res
print(make_code(6)) # 想生成几位就填几位

浙公网安备 33010602011771号