模块基本使用

内容概括
实时监控日志

函数

定义函数的三种形式

调用函数的三种形式

返回函数的三种形式

定义一个简单登录功能的函数

模块

内容详细
实时监控日志

1.记录日志

import time
with open('aa.logfile',mode='at',encoding='utf-8') as f:
f.write('%s 张三 192.168.10.1 ok\n' % time.strftime('%Y-%m-%d %H:%M:%S'))

2.每次输入新的日志都会进行实时监控传输

with open('aa.logfile',mode='rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
continue
else:
print(line.decode('utf-8'),end='')

函数

定义函数的三种形式

函数的定义与调用

定义

定义的语法

'''
def 函数名(参数1,参数2,...):
"""文档描述"""
函数体
return 值
'''

一、定义函数的三种形式

形式一:无参函数

def func():

# x # 此处在不调用函数func()时,运行不会报错,因为定义函数不会执行函数体代码

# print( # 此处在不调用函数func()时,运行会报错,因为定义函数会检查语法

print('ycc')

print('xixi')

print(func) # <function func at 0x00000253BCFFF160>

func()

'''
定义函数发生的事情:
1.申请内存空间给函数体代码
2.将上述内存地址绑定给函数名
3.定义函数不会执行函数体代码,但是会检测语法

这里定义函数跟定义变量是一样的

申请内存空间给变量值
将上述的内存地址绑定给变量名

'''

'''
调用函数发生的事情:
1.通过函数名找到函数的内存地址 print(func)
2.函数名后加括号就是在出发函数体代码的运行 func()
'''

示范:

1.

x = 1

def func():

print(x)

print('ycc')

# 此时运行后不会输出,因为还未调用函数

2.

def bar():

print('haha')

def func():

print(bar) # <function bar at 0x0000019FA128F160>

print('ycc') # ycc

func()

'''
此时这里已经定义了bar函数,虽然没调用bar(),但是已经将函数体代码的内存地址绑定给了函数名bar
因此这里print(bar) 输出了函数名bar的内存地址,没输出'haha',因为bar()没调用
'''

3.

def bar():

print('haha')

def func():

bar() # 调用函数bar(),输出'haha'

print(bar)

print('ycc')

func()

'''
haha
<function bar at 0x00000270EFF3F160>
ycc
'''

4.

def bar():

func()

print('haha')

def func():

print('ycc')

bar()

'''
输出结果:
ycc
haha
定义函数不会执行函数体代码,但是会检测语法
调用bar(),开始执行函数体代码 func() print('haha'),
执行func()时,def func() print('ycc')已经进入内存,因此调用成功
'''

5.

def bar():

func()

print('haha')

bar()

def func():

print('ycc')

'''
报错:定义函数不会执行函数体代码,但是会检测语法
调用bar(),开始执行函数体代码 func() print('haha'),
执行func()时,def func() print('ycc')未进入内存,调用不成功
'''

形式二:有参函数

def func(x,y):

print(x,y)

func(1,2)

'''
输出结果:1 2 相当于把 x = 1 ,y = 2,进行了一个赋值
'''

形式三:空函数,函数体代码为pass

def func(x,y):

pass

func(1,2) # 无作用


1.无参函数的应用场景

def interactive():

inp_username = input('username:')

inp_age = input('age 😂

msg = '名字:{} 年龄:{}'.format(inp_username,inp_age)

print(msg)

interactive()

interactive()

interactive()

interactive()

调用函数的三种形式

二、函数调用的三种方式

1.语句的形式:只加括号调用函数

interactive()

add()

2.表达式形式:

def add(x,y): # 参数:原材料

res = x + y

return res # 返回值:成品

赋值表达式:

res = add(1,2)

print(res) # 输出:3

数学表达式:

res = add(1,2)*30

print(res) # 输出:90

3.函数调用可以当作参数

res = add(add(1,2),10) # 这里不一定要把调用函数add()当作参数,其他函数也可以

print(res) # 输出:13

返回函数的三种形式

三、函数返回值的三种形式

'''
函数返回值的定义:
return 是函数结束的标志,即函数体代码运行到return会立即终止函数运行,
并且会将return后的值当作本次运行的结果返回:
'''

例:

def func():

print(111)

return

print(222)

print(333)

func()

运行结果:111

第一种形式:返回None

1.函数体内没return

def func():

pass

res = func()

print(res)

2.return None

def func():

return None

res = func()

print(res)

第二种形式:return 值

def func():

return 100

res = func()

print(res)

输出结果:100

第三种形式:返回多个值:用逗号隔开多个值,会被return返回成元组

def func():

return 100,[1,2],

res = func()

print(res,type(res))

输出结果:(100, [1, 2], {'name': 'ycc'}) <class 'tuple'>

定义一个简单登录功能的函数

def func():
inp_username = input('name is:').strip()
inp_pwd = input('pwd is:').strip()
with open('user.txt',mode='rt',encoding='utf-8') as f:
for line in f:
name, pwd = line.strip('\n').split('😂
if inp_username == name and inp_pwd == pwd:
print('登录成功')
break
else:
print('账号或密码错误')
func()
func()
func()
func()

模块

'''
一、模块的介绍
模块就是一系列功能的集合体,分为三大类
1.内置的模块
2.第三方的模块
3.自定义的模块
一个python文件本身就是一个模块,文件名 m.py ,模块名 m
ps:模块分为四种模式
1.使用python编写的.py文件
2.把一系列模块组织到一起的文件夹(注:文件夹下有一个_init_.py文件,该文件夹称之为包)
3.已编译为共享库或DLL的C或C++扩展
4.使用C编写并链接到python解释器的内置模块

二、为何要用模块
1.内置与第三方的模块拿来就用,无需定义,这种拿来主义,可以极大的提升自己的开发效率
2.自定义的模块
可以将程序的部分功能提取出来放到一个模块中为大家共享使用
好处是介绍了代码冗余,程序组织结构更加清晰

三、如何用模块
'''
'''
foo.py文件的内容:
x=1
def get():
print(x)
def change():
global x
x=0
'''

一、如何用模块

import ...

'''
首次模块导入会做三件事:
1、执行源文件代码
2、产生一个新的名称空间用于存放源文件执行过程中产生的名字
3、在当前执行文件所在的名称空间中得到一个名字foo,该名字指向新创建的模块名称空间,
若要引用模块名称空间中的名字,需要加上该前缀
'''

import foo

foo.x

foo.get()

foo.change()

'''
加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,
所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x,
执行foo.get()或foo.change()操作的都是源文件中的全局变量x
'''

例:

x = 100

import foo

foo.x # 这里虽然定义了变量x,但是foo.x 输出结果仍为 1

foo.get()

foo.change()



'''
需要强调一点是,第一次导入模块已经将其加载到内存空间了,
之后的重复导入会直接引用内存中已存在的模块,
不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。
'''

import sys

print(sys.modules)

# 'foo': <module 'foo' from 'D:\Users\ycc\PycharmProjects\pythonProject\day 13\foo.py'>}

二:导入模块的模式与规范

模式

# 1.可以improt语句导入多个模块(推荐使用)
# import a
# import b
# ...


# 2.在一行导入,用逗号分隔开不同的模块(不推荐)
# import a,b,c,...

规范(按以下顺序导入模块,虽然不按顺序也不会报错,但是算是自发的规定)

# 1.内置模块
# 2.第三方模块
# 3.自定义模块





from 模块 import 模块内的功能


from foo import x,get,change #将模块foo中的x和get导入到当前名称空间

a=x #直接使用模块foo中的x赋值给a
get() #直接执行foo中的get函数
change() #即便是当前有重名的x,修改的仍然是源文件中的x
'''
无需加前缀的好处是使得我们的代码更加简洁,
坏处则是容易与当前名称空间中的名字冲突,
如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。

'''

其他导入语法

import foo as f # 注:这里as f后不要加冒号

这里相当于把foo换个名字,因为可能会遇到名字特别长的模块名,为了调用时方便,可这样操作

f.x #
f.get()
f.change()

posted @ 2021-06-21 15:51  Aisa  阅读(96)  评论(0)    收藏  举报