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解释器的内置模块

模块的来源

  1. python自带的模块/库
    1.内置模块
    2.标准库
  2. 第三方的库
  3. 自定义库

使用模块之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))  # 想生成几位就填几位
posted @ 2021-06-09 20:44  Koalaaa  阅读(53)  评论(0)    收藏  举报