一,复习

  1. 字符编码
  2.  
  3.     文件头:py2ASCIIpy3UTF-8
  4.  
  5.     三种字符串:u' ' b ' ' r ' '
  6.  
  7.     u' ' .endcode(' utf-8 ')
  8.  
  9.     b' '.deconde(' utf-8 ')
  10.  
  11.     str(b' ' , encode=' utf-8 ' )
  12.  
  13.     bytes( u' ' , encode=' utf-8 ')
  14.  
  15. 文件操作:
  16.  
  17.     三步骤:
  18.         1,打开文件
  19.         2,操作文件(读写)
  20.         3,关闭
  21.     简写:
  22.         with open => 可以自动关闭文件流
  23.     操作模式:
  24.          r w a x
  25.         从:t b +
  26.     seek:游标(偏移量,游标操作位置)与b模式结合
  27. 函数基础:

  28.     函数的定义:def 函数名():函数体
  29.     函数调用:函数名()
  30.     函数的返回值:省略 return return一个值 return多个值 =》本质返回一个装有多个值得元组

二,今日内容:

  1.     1,函数的参数:实参与形参
  2.     2,函数对象:函数名
  3.     3,名称空间与作用域:LEGB
  4.     4,闭包:函数的嵌套定义
  5.     5,装饰器:闭包的一种应用场景
  6.     6,迭代器对象:迭代器,生成器,for迭代
  7.     7,匿名函数
  8.     8,内置函数
  9.     9,三元表达式,列表,字典生成式
  10.     10,模块

三,如何定义函数:

  1.     1,功能的单一化
  2.     2,函数内部需要外部的资源:通过函数的参数来实现
  3.     3,函数执行后的结果需要告诉外界:通过返回值告诉给外界

四,函数的参数:

  1. 形参与实参:
  2.     形参:在函数定义时()里出现的参数
  3.       ——形参本身没有实际值(意义),在函数调用时,传入什么实参,形参就装有什么值
  4.     实参:在函数调用时()里出现的参数
  5.       ——实参有实际值(意义)
  6.     重点:函数调用传参:将实参的值赋值给形参 | 形参要获取外界的值只能通过实参进行获取
  7.  
  8.     def fnab):   #a , b :形参
  9.       pass
  10.     a = 10
  11.     fna , 20     #a , 20 实参

 两种实参:
    1,位置实参:

      a,传参两种方式:实参名|实参具体值

      b,必须按位置对形参进行传值

    2,关键字实参:

      a,传参两种方式:形参名=实参名 | 形参名=实参值

      b,可以指名道姓对形参进行传值,所以可以不用按位置进行传参

    '''

      def func(a,b,c):

         print(a,b,c)

      #func(10,b=20,200)  #报错:SyntaxError: positional argument follows keyword argument

    '''

    #重点:两种实参在一起进行传参时:必须位置在前,关键字在后

 两大形参分类:

    形参种类:

      1,位置形参:

        ——普通位置形参

        ——默认值形参

        ——可变长位置形参

      2,关键字形参:

        ——有默认值关键字形参

        ——无默认值关键字形参

        ——可变长关键字

    '''

      def fn(a,b,*,x,y):  #位置形参:a,b  关键字形参:x,y

        pass

    '''

    重点:

      1,*为分水岭

      2,位置实参只能给位置形参进行传值

      3,关键字实参可以给位置形参与关键字形参进行传值

    

 两个带默认值的形参:

    '''

      def fn2(a=10,*,x=20):

        print(a,x)

      fn2(100,x=200)

    '''

    总结:

      1,有默认值的参数可以不用传值

      2,*前有默认值的叫默认值参数,属于位置形参,可以被位置及关键字实参进行传值

      3,*后有默认值的叫有默认值的关键字形参,属于关键字形参,只能被关键字实参进行传值

      4,如果省略*,有默认值的形参都是默认值参数

 不带默认值与带默认值形参结合使用:  

def fn3(a, b=10, *, x, y=20, z):
print(a, b, x, y, z)
fn3(100, x=200, z=300)
# 总结:
# 1.没有默认值的必须传参,有默认值的可以传也可以不传
# 2.位置有值的必须出现在无值之后,关键字顺序不做要求

 

 可变长位置形参与可变长关键字形参:

  1. def fn4(a, b=10, *args, x, **kwargs):
       print(a, b, x)
       print(args)
       print(kwargs)
    fn4(10, 20, 30, x=100, y=200, z=300)
  1.   总结:
    1.可变长是用来接收未接收完的值(接收0n个):
         -- *args用来接收所有没有接收完的位置(只能接收位置实参)
         -- **kwargs用来接收所有没有接收完的关键字(只能接收关键字实参)
      2.*args必须出现在所以位置参数之后,**kwargs必须出现在所以参数之后
  1. # 常见应用场景
      假设第一个位置永远是参数name
  2.  
  3.   def func4(*args, **kwargs):
         name = args[0]  # 将name抽出来

      def func44(name, *args, **kwargs):
         # name 可以直接接收,省了抽出来的过程
         pass

  总结:

1.位置实参只能给位置形参传值
2.关键字实参可以给位置及关键字形参传值
3.有默认值的可以不用传参
4.可变长位置形参只能接受位置实参,接受位置形参没有接收完的位置实参,存放到元组中
5.可变长关键字形参只能接受关键字实参,接受关键字形参没有接收完的关键字实参,存放到字典中
6.*args必须出现在所有位置形参之后,**kwargs必须在所有形参之后

 可变长整体传参:打散传值

      '''

def fn(*args, **kwargs):
print(args, kwargs)

fn([1, 2, 3], {'a':1 , 'b': 2}) # =>接收到的 ([1, 2, 3], {'a':1 , 'b': 2}) {}
fn(*[1, 2, 3], **{'a':1 , 'b': 2}) # =>接收到的 (1, 2, 3) {'a':1 , 'b': 2}

# 注:字符串也可以作为单列集合进行打散传递
fn(*'abc') # => ('a', 'b', 'c') {}

      '''

五,函数对象:

  1. #函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象
  2.  
  3. #函数对象的应用场景
  4.   1 可以直接被引用
  5.   2 可以当作函数参数传递
  6.   3 可以作为函数的返回值
  7.   4 可以作为容器类型的元素
  8.  
  9. '''
      #功能体:
       def add(n1,n2):
          return n1 + n2
  10.  
  11.    def low(n1,n2):
          return n1 - n2
  12.  
  13.    def jump(n1,n2):
          return n1 * n2
  14.  
  15.   #完成功能:
       def computed(n1,n2,fn):  #fn = add|low|jump
          res = fn(n1,n2)    #调用具体的功能
          return res
  16.  
  17.   #功能对应关系:
       method_map = {       #指令与函数对象的对应关系
          '1':add,
          '2':low,
          '3':jump
        }
      
      #获取功能:
       def get_method(cmd):
          if cmd in method_map:
            return method_map[cmd]  #返回 add|low|jump
          return add           #当指令错误,add作为默认功能
       while True:
        cmd = input('cmd')
        res = get_method(cmd)(10,20)  #根据指令获取功能并调用得到结果
        print(res)
    '''

六:函数的嵌套调用

  1. # 函数的嵌套调用:在一个函数内部调用另一个函数
  2. # 求两个数最大值
    '''
      def max_tow(n1,n2):
        if n1 > n2:
          return n1
        return n2
  3.  
  4.   #求三个数的最大值
      def max_three(n1,n2,n3):
        max = max_tow(n1,n2)
        return max_tow(max,n3)
  5.  
  6.   #求四个数的最大值
      def max_four(n1,n2,n3,n4)
        max = max_three(n1,n2,n3)
        return max_tow(max,n4)
      print(max_four(20,90,30,10))
    '''

七:名称空间:

# 名称空间:存放名字与内存空间地址对应关系的容器
# 作用:解决由于名字有限,导致名字重复发送冲突的问题 - 内置全局局部可以同时使用一个名字存放不同地址

# 三种名称空间
# Built-in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
# Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
# Local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁

# 加载顺序:Built-in > Global > Loca
# -- 采用堆栈存储数据的方式(压栈),导致内置最后被访问

八,函数的嵌套定义:

  1. # 函数的嵌套定义:在函数内部定义函数
  2. # 诞生的理由:一个函数想使用另一个函数内部的变量,可以定义在其内部
  3.  
  4. '''
      def func():
        a = 10
        def fn():
          print(a)
        return fn
  5.  
  6.   new_fn = func()
      new_fn()
    '''
  7.  
  8. #两个与函数有关的关键字:global nonlocal
  1. '''
      #global :统一局部与全局的变量名
      num = 10
      def outer():
        #global num
        #num = 100
        def inner():
          global num
          num = 1000
  2.  
  3.   #nonlcal:统一局部与嵌套局部的变量名
      def outer():
        num = 100
        def inner():
          nonlcal num
          num = 1000
    '''

九,作用域:

  1. # 作用域:名字起作用的范围
  2. # 作用:解决同名字可以共存问题 - 不同作用域相同名字的值都能在其作用域范围下进行使用
  3. '''
  4. 四种作用域: LEGB
  5. Built-in:内置作用域 - 所有文件所有地方都可以被访问
  6. Global:全局作用域 - 在当前文件的所有位置
  7. Enclosing:嵌套作用域 - 自身内部与内部的子函数
  8. Local:局部作用域 - 只有自身内部
  9. '''
  10. # 加载顺序:Built-in > Global > Enclosing > Local
  11. # 访问(查找)顺序:报错 < Built-in < Global < Enclosing < Local
  12. # 作用范围:Built-in > Global > Enclosing > Local

 十,闭包

  1. # 闭包:定义在函数内部的函数,这个内部的函数就是闭包
  2.  
  3. #应用场景:
  4.  
  5.   1,可以去使用其他函数的内部变量,且还可以保证调用位置不变(闭包的函数对象作为那个函数的返回值)
      '''
        def outer():
          count = 3000
          def fn():
            print(count) #能使用outer内部的变量count
          return fn
  6.  
  7.     #还是在外界调用
        outer()() #outer()()=>fn()=>调用fn
      '''
  8.  
  9.   2,延迟执行(外层函数可以为内部函数传递参数)
      '''
        import requests
        def outer(url):
          def show_html():
            response = requests.get(url)
            print(response.text)
          return show_html
  10.  
  11.     #制作 爬百度与新浪的 函数对象
        show_baidu = outer('https://www.baidu.com')
        show_sina = outer('https://www.sina.com.cn')
  12.  
  13.     #延迟的需求来了,需要爬百度,就用百度函数对象,需要爬新浪,就用新浪函数对象
        show_baidu()
        show_sina()
        show_baidu()
  14.  
  15.   '''

十一,装饰器

  1. # 装饰器:装饰器就是闭包的一个应用场景
  2. # -- 外层函数与内层函数形成的闭包结构的一种综合使用
  3.  
  4. # 重点:开放封闭原则
  5. # 开放:拓展功能的点是开放的 - 可以为之前的函数添加新功能
  6. # 封闭:1.不能改变原函数的源代码 2.还有通过原函数的函数对象来调用函数
  7.  
  8. '''
      def huaping():
        print('插花功能')
  9.  
  10.   temp = huaping
  11.  
  12.   def my_huaping():
        temp()
        print('观赏功能')
  13.  
  14.   huaping = my_huaping
  15.  
  16.   huaping()
    '''  
    #------------------------------------------------------
    '''
      def huaping():
        print('插花功能')
  17.  
  18.   def outer(temp):       #temp = huaping
        def my_huaping():
          temp()
          print('观赏功能')
        return my_huaping
      huaping = outer(huaping) #huaping = my_huaping
  19.  
  20.   huaping()
    '''
    #------------------------------------------------------
    '''
      def outer(temp):    #temp = huaping
        def my_huaping():
          temp()
          print('观赏功能')
        return my_huaping
      
      @outer   #huaping = outer(huaping)
      def huaping():
         print('插花功能')
  21.  
  22.   huaping()
    '''
    #-----------------------------------------------------
    #被装饰的函数可能有参有返回:装饰器模板,可以满足所有参数,且能装饰原函数返回值
    '''
    def outer(func):  #temp = huaping
       def inner(*args , **kwargs):
          pass
          res = func(*args,**kwargs)
          pass
          return res
       return inner
  23.  
  24. @outer
    def any_method():
       pass
    '''

十二:装饰器案例

  1. #为登录功能添加账号检验功能:必须是3个及以上英文字母组成
    '''
      def check_user(func):
        def inner(user,pwd):
          if not(user.isalpha() and len(user) >= 3):
            return '账号不合法'
          res = func(user,pwd)
          return res
        return inner
    '''
  2.  
  3. #为登录功能添加密码检验功能:必须是3个及以上英文字母或数字组成
    '''
      def check_pwd(func):
        def inner(*args,**kwargs):
          pwd = args[1]
          if not(pwd.isalnum() and len(pwd) >= 3):
            return '密码不合法'
          res = func(*args,**kwargs)
          return res
        return inner
    '''
  4.  
  5. #为登录结果的修饰装饰器:True => 登陆成功 ,False => 登录失败
    '''
      def change_res(func):
        def inner(*args,**kwargs):
          res = func(*args,**kwargs)
          if res = True:
            return '登陆成功'
          return '登陆失败'
        return inner
    '''
  6.  
  7. #装饰器被执行的过程是从上至下
    '''
      @check_user        #login = check_user(func=login)=inner
      @check_pwd
      @chang_res
      def login(user,pwd):  #被装饰的函数对象
        if user == 'Owen' and pwd == '123':
          return True
        return False
      user = input('user: ')
      pwd = input('pwd: ')
      res = login(user,pwd)
      
      print(res)
    '''

周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)的更多相关文章

  1. Python记录9:函数4:名称空间作用域+闭包函数+装饰器

    ''' 一: 名称空间namespaces     名称空间就是存放名字与值绑定关系的内存空间 二: 名称空间分为三种     内置名称空间:         1. 特点: 存放是python解释器自 ...

  2. Day11名称空间,作用域,闭包函数

    Day11 1.函数对象: ①可以被引用 ​ ②可以作为另一个函数的参数 ​ ③可以作为另一个函数的返回值0 ​ ④可以被存储到容器类型中 2.函数嵌套: ①嵌套调用:在一个函数中调用了另一个函数 ​ ...

  3. python-函数的对象、函数嵌套、名称空间和作用域

    目录 函数的对象 函数对象的四大功能 引用 当做参数传给一个函数 可以当做函数的返回值 可以当做容器类型的元素 函数的嵌套 函数的嵌套定义 函数的嵌套调用 名称空间与作用域 名称空间 内置名称空间 全 ...

  4. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  5. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  6. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  7. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

  8. python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

    今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): y=func() print(y) def foo( ...

  9. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

随机推荐

  1. 第一个用eclipse打包APK时报错一个错误怎么解决

    这个问题也是我在android开发群里面解决的一个问题. 如果有什么想法或者想法可以在下面进行评论,我们可以一起交流一下! 我们在eclipse中开发完一个程序之后,需要将其打包为APK的安装包,我们 ...

  2. Tomcat配置文件Executor元素属性介绍

    该元素可用于Tomcat 6.0.11以及更高版本. 允许您为一个Service的所有Connector配置一个共享线程池.在运行多个Connector的状况下,这样处理非常有用,而且每个Connec ...

  3. Scrapy-Redis分布式爬虫常规操作

    一.X-path 的常规用法1./是从根节点选取,有顺序2.//从当前节点选择文档中的节点,无顺序3..选取当前节点4...选取当前节点的父节点5.@选取属性6. //div[@class='docl ...

  4. Kotlin for循环使用

    普通for循环 for(i in 1..4){ println(i) } 结果为1234 循环四次 反序for循环 for(i in 4 downTo 1){ println(i) } 结果为4321 ...

  5. 当input框输入到限定长度时,自动focus下一个input框

     需求背景 需要输入一串15位的数字,但是要分为3个输入框,每个输入框限定长度5位,当删除当前输入框的内容时,focus到上一个输入框: 实现方法 var field = $('.phone-fiel ...

  6. 华为有AI,这场转型战有点大

    华为有AI,这场转型战有点大 https://mp.weixin.qq.com/s/qnUP5cgbNxXcAT82NQARtA 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为有AI ...

  7. Mysql 数据库常用配置命令

    1.查看mysql数据库默认编码: mysql> show variables like "character%"; +--------------------------+ ...

  8. 优秀代码摘录片段一:LinkedList中定位index时使用折半思想

    在LinkedList有一段小代码,实现的功能是,在链表中间进行插如,所以在插如的过程中会需要找到对应的index位置的node元素: 如果放在平时只为了实现功能而进行遍历查找,很多人会直接使用一个w ...

  9. <5>Python的uwsgi web服务器

    一.是什么? uWSGI是web服务器,用来部署线上web应用到生产环境.uWSGI实现了WSGI协议.uwsgi协议.http协议.WSGI(Web Server Gateway Interface ...

  10. adb部署及使用

    一 掌握adb部署&使用方法及常用命令 1.何为adb? sdk软件开发套件software development kit apk是安卓应用安装包 adb是android sdk的一个工具, ...