一,文件处理
以追加方式读取文件:
with open('a.txt','a') as f:///以追加方式打开文件 f.write('zhuijia')///追加写入,注意:追加写的时候,鼠标是从文件末尾开始写入的。
鼠标的移动:
备注:光标的移动,除了seek的0模式外,其他都以字节为单位!注意:是字节而不是字符。 import time///加载time模块 with open('a.txt','rb') as f:///以二进制-只读模式打开文件,并将其赋予f f.seek(0,2)///执行鼠标移动,第二个参数共有3个值。0:可以以tb方式打开,1,2 while True:///循环条件体 line = f.readline()///按行读取 if line///条件存在判断 print(line)///执行打印操作 else:///条件否定 time.sleep(1)///休息1s,进入下一次循环
二,函数
1,什么是函数
通俗点说,就是用来实现一系列功能的代码的集合。用老师的话说,就是程序员的工具,用于构建项目的工具的组合。
2,为什么要用到函数
a,逻辑清晰。b,模块分明。c,代码简明而高效
3,函数的定义
特别注意:在函数定义阶段,只是声明了一个函数,不做任何具体的操作。 函数定义阶段,分为两个部分。1,定义一个函数赋值给test。2,定义函数体。 调用函数阶段,才会真正执行函数。 def test():///定义一个函数,括号内可以有参数。 '''注释,即函数的帮助信息''' pass///执行函数体 test()///调用函数,括号内可以有参数。
4,函数的分类:内置函数,自定义函数。
5,定义函数的三种形式:
a,有参函数。
def use_login1(user,passwd):///定义有参函数 if user == 'user01' and passwd == 'pass01': print('success') else: print('failed') use_login1('user01','pass01')
b,无参函数。
def use_login2():///定义无参函数 user = 'user01' passwd = 'pass01' if user == 'user01' and passwd == 'pass01': print('success') else: print('failed') use_login2()
c,空函数。用于代码结构立体化
def use_login3():///定义空函数 pass use_login3()
6,函数的注意事项:
a,必须先定义,再调用。此点参考变量的概念。
b,函数定义阶段,只检测语法,不执行代码。也就是说。语法错误在函数定义阶段就会检测出来,而代码的逻辑错误只有在执行时才会知道
7,函数的特性:
a,函数是第一类对象。
b,函数可以被引用。
c,函数可以当做参数传递。
d,返回值可以是函数。
e,可以当做容器类型的元素
f,函数支持嵌套。
三,函数调用
函数的调用:函数名加括号 即:1,先找到名字 2,根据名字调用代码
函数的返回:
a,无return->None
b,return 1个值->返回1个值
c,return 逗号分隔多个值->元组
什么时候该有返回值?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值。通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有返回值?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值。通常无参函数不需要有返回值
四,函数参数(重点)
函数参数:形参,实参。函数调用时,将值绑定在变量名上,函数调用结束,解除绑定。
形参:函数定义阶段指定的参数,即变量名。
实参:函数调用阶段指定的参数,即变量值。
形参分为:位置形参,关键字形参,默认形参,可变长参数*args形参。
实参分为:位置实参,关键字实参,可变长参数*kwargs实参
def test(tes1,tes2):///定义时,参数为变量名 if tes1 == 'user01' and tes2 == 'passwd01': print('success') else: print('error') test('1','2')///调用时,参数为变量值 test('user01','passwd01')///调用时,参数为变量值
四,形参与实参
位置形参:参考列表,从左到右,依次对应,不允许有空值。
关键字形参:参考字典,key-values一一对应。
位置实参:参考列表,从左到右,依次对应,不允许有空值。
关键字实参:参考字典,key-values一一对应
组合参数:关键字与位置参数可以组合使用,但是务必注意:关键字参数必须在位置参数的后面。
*args:将多个形参,赋值给args
**kwargs:将多个实参,赋值给kwargs
五,名称空间与作用域
1,名称空间:存放名字的地方。<如变量x=1,1是变量值存放于内存中,名字x存放在哪里?名称空间正是存放名字x与1绑定关系的地方。>
2,名称空间的加载顺序:python test.py
a,python解释器先启动,因而首先加载的是:内置名称空间。
b,执行test.py文件,然后以文件为基础,加载全局名称空间。
c,在执行文件的过程中,如果调用函数,则临时产生局部名称空间。
3,名字的查找顺序
局部名称空间-->全局名称空间-->内置名称空间。
注意:在全局无法查看局部的,在局部可以查看全局的。
六,函数的分类
内置函数:python自带的函数,python解释器运行时就已经存在。作用于整个python脚本。
全局函数:全局定义的函数,也就是顶着第一行走的函数。作用于整个python脚本。
局部函数:局部定义的函数,也就是函数体之内的函数。作用于当前函数体中。
函数作用域的执行顺序:局部函数-->全局函数-->内置函数。
六,闭包函数(特重点)
闭包函数的概念:内部函数包含对外部作用域而非全局作用域的引用。
闭包函数的解析:之前都是通过参数将外部的值传给函数,闭包提供了另外一种思路,即通过函数将内部的值传给函数本身。
闭包函数的意义<自己定义>:因为局部函数只定义了当前作用域,无法被上一级作用域所调用。为了解决这个问题,出现了闭包函数的概念。她所做的工作,是将本函数体内的定义函数,可以被上一级作用域调用。
闭包函数的意义<老师定义>:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。
def index(url): def get(): return urlopen(url).read() return get baidu = index('http://www.baidu.com') print(baidu().decode('utf-8'))
七,装饰器(闭包函数的实现方式)
装饰器:闭包函数的应用场景。遵循开放封闭原则,即对修改封闭,对扩展开放。
装饰器的概念:装饰他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
装饰器的原则:1,不修改被装饰对象的源代码,2,不修改被装饰对象的调用方式。
装饰器的目标:在遵循1,2的前提下,为被装饰对象添加上新的功能。
装饰器的语法:
被装饰函数的正上方,单独一行 @deco1 @deco2 @deco3 def foo(): pass foo=deco1(deco2(deco3(foo))) 补充:老师的代码,其实没弄懂。 from functools import wraps def deco(func): @wraps(func) #加在最内层函数正上方 def wrapper(*args,**kwargs): return func(*args,**kwargs) return wrapper @deco def index(): '''哈哈哈哈''' print('from index') print(index.__doc__)