模块基本使用
内容概括
实时监控日志
函数
定义函数的三种形式
调用函数的三种形式
返回函数的三种形式
定义一个简单登录功能的函数
模块
内容详细
实时监控日志
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()

浙公网安备 33010602011771号