zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Use MusicBrainz in iOS(三)查询专辑的完整信息
    内存寻址一(分段)
    POJ 1018 Communication System (动态规划)
    利用Eclipse中的Maven构建Web项目(二)
    cocos2d-x2.2.3学习
    (排序算法整理)NEFU 30/32
    POJ 1066 昂贵的聘礼
    2014年腾讯暑假实习软件开发笔试题汇总
    Android学习之——自己搭建Http框架(1)
    C 语言之预处理 ---------文件包括
  • 原文地址:https://www.cnblogs.com/wang-jingjing/p/8053675.html
Copyright © 2011-2022 走看看