day03-函数

一,文件处理

以追加方式读取文件:

with open('a.txt','a') as f:///以追加方式打开文件
    f.write('zhuijia')///追加写入,注意:追加写的时候,鼠标是从文件末尾开始写入的。
View Code

鼠标的移动:

备注:光标的移动,除了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,进入下一次循环
View Code

二,函数

  1,什么是函数

  通俗点说,就是用来实现一系列功能的代码的集合。用老师的话说,就是程序员的工具,用于构建项目的工具的组合。

  2,为什么要用到函数

    a,逻辑清晰。b,模块分明。c,代码简明而高效

  3,函数的定义

特别注意:在函数定义阶段,只是声明了一个函数,不做任何具体的操作。
函数定义阶段,分为两个部分。1,定义一个函数赋值给test。2,定义函数体。
调用函数阶段,才会真正执行函数。
def test():///定义一个函数,括号内可以有参数。
    '''注释,即函数的帮助信息'''
    pass///执行函数体
test()///调用函数,括号内可以有参数。
View Code

  4,函数的分类:内置函数,自定义函数。

  5,定义函数的三种形式:

    a,有参函数。

def use_login1(user,passwd):///定义有参函数
    if user == 'user01' and passwd == 'pass01':
        print('success')
    else:
        print('failed')
use_login1('user01','pass01')
View Code

    b,无参函数。

def use_login2():///定义无参函数
    user = 'user01'
    passwd = 'pass01'
    if user == 'user01' and passwd == 'pass01':
        print('success')
    else:
        print('failed')
use_login2()
View Code

    c,空函数。用于代码结构立体化

def use_login3():///定义空函数
    pass
use_login3()
View Code

  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')///调用时,参数为变量值
View Code

四,形参与实参

 位置形参:参考列表,从左到右,依次对应,不允许有空值。

 关键字形参:参考字典,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'))
View Code

七,装饰器(闭包函数的实现方式)

 装饰器:闭包函数的应用场景。遵循开放封闭原则,即对修改封闭,对扩展开放。

 装饰器的概念:装饰他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。

 装饰器的原则: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__)
View Code

 

posted @ 2017-12-17 23:26  W-Alice  阅读(159)  评论(1编辑  收藏  举报