函数的迭代器

  1. 关键字global,nonlocal

    例:

    ​ count = 0
    ​ def func():
    ​ count += 1
    ​ func()

    在函数中对不能直接对全局变量进行修改

    报错:UnboundLocalError: local variable 'count' referenced before assignment
    解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。

    global(剪切):在局部作用域中声明一个全局变量,

    ​ 可以修改全局变量

    def fun():
        global name
        name=1
        print(globais())
        print(locals())
        name+=1
        print(globals())
    fun()
    print(name)
    print(globals())            
    1. 可以修改全局变量

      count=0
      def fun():
       global count
       count+=1
      print(count)
      fun()
      print(count)

    nonlocal(复制)可以对父级作用域的变量进行修改,并且在当前作用域创建(复制)一份此变量

    ​ 不能对全局变量进行操作

    def fun():
        count=0
        def inner():
            nonlocal count
            count+=1
            print(count)
            print(locals())
        inner()
        print(locals)
    fun()
    UnboundLocalError: local variable 'count' referenced before assignment
    解释器认为:如果你在局部作用域对一个变量进行修改了,你在局部作用域已经定义好这个变量了。
  2. 默认参数的坑(必考)

    def func(a,b=False):
    #     print(a)
    #     print(b)
    # func(1,True)
    # 当你的默认参数如果是可变的数据类型,你要小心了。
    
    # def func(a,l=[]):
    #     l.append(a)
    #     return l
    # print(func(1))  # [1,]
    # print(func(2))  # [2,]
    # print(func(3))  # [3,]
  3. 函数名的应用

    函数名是一个特殊的变量

    函数名是一个变量

    函数名可以作为容器类类型的变量

    函数名可以作为函数的实参

    函数名可以作为函数的返回值

    # a = 1
    # b = 2
    # c = a + b
    # print(c)
    # 函数名是一个特殊的变量。
    # def func():
    #     print(666)
    #
    # print(func)  # func = <function func at 0x00000000003F1EA0>
    # 1,函数名指向的是函数的内存地址,加上()就执行这个函数。
    # func()
    
    # 2函数名是一个变量。
    # age1 = 12
    # age2 = age1
    # age3 = age2
    # print(age3)
    # def func():
    #     print(666)
    #
    # f1 = func
    # f2 = f1
    # f2()
    # f1()
    
    # 3. 函数名可以作为容器类类型的元素。
    # a = 1
    # b = 2
    # c = 3
    # l = [a,b,c]
    # print(l)
    
    # def func1():
    #     print('in func1')
    #
    # def func2():
    #     print('in func2')
    #
    # def func3():
    #     print('in func3')
    #
    # l = [func1, func2, func3]
    # # print(l)
    # for i in l:
    #     i()
    
    # 4. 函数名可以作为函数的实参。
    
    # a = 1
    # def func(argv):
    #     print(argv)
    # func(a)
    
    # def func1():
    #     print('in func1')
    #
    # def func2(argv):
    #     argv()
    #     print('in func2')
    #
    # func2(func1)
    
    # 5. 函数名可以作为函数的返回值。
    
    # b = 666
    #
    # def func1():
    #     print('in func1')
    #
    # def func2(argv):
    #     print('in func2')
    #     return argv
    # ret = func2(b)
    # print(ret)
    
    
    
    # def func1():
    #     print('in func1')
    #
    # def func2(argv):
    #     # argv = func1 : function 43543
    #     print('in func2')
    #     return argv
    # ret = func2(func1)  # func1 : function 43543
    # ret()
    
    # def wrapper():
    #
    #     def inner():
    #         print(666)
    #     return inner
    # # ret = wrapper()
    # # ret()
    # wrapper()()
  4. 格式化输出

    不区分大小写

    加入表达式

    特殊字符不能放

     1,不区分大小写
    # num = input('>>>')
    # s = F'python{num}'
    # print(s)
    
    # 可以加入表达式
    
    # s1 = 'alex'
    # s2 = f'我的名字{s1.upper()}'
    # print(s2)
    
    # l1 = ['太白', 18, 176]
    # s1 = f'我的名字{l1[0]},我的年龄{l1[1]},我的身高{l1[2]}'
    # print(s1)
    
    # 可以结合函数
    # def func(a,b):
    #     return a + b
    
    # s1 = f'最终的结果{func(1,3)}'
    # print(s1)
    
    # 不能放一些特殊的字符 ! , : { } ;
    # print(f"替换结果{{{73}}}")
    # print(f'{12,}')
  5. 可迭代对象

    1. 可迭代对象

      字面意思分析:可以重复的迭代的实实在在的东西。

      list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定)

      专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象。

      内置函数:dir() print(dir(str))

      判断一个对象是否是可迭代对象: print('iter' in dir(str))

      优点:

      1. 直观。
      2. 操作方法较多。

      缺点:

      1. 占内存。
      2. 不能迭代取值(索引,字典的key)。
    2. 迭代器

      字面意思:可以重复迭代的工具。

      专业角度: 内部含有'__iter__'并且含有"__next__"方法的对象,就是迭代器

      可迭代对象转化成迭代器:

      l1 = [1, 2, 3, 4, 5]
      # 内置函数iter()
      obj = iter(l1)
      # 迭代器可以迭代取值。利用next()进行取值
      l1 = [1, 2, 3, 4, 5]
      # 内置函数iter()
      obj = iter(l1)
      # print(obj)
      print(next(obj))
      print(next(obj))
      print(next(obj))
      print(next(obj))
      print(next(obj))
      print(next(obj))

      迭代器优点:

      1. 非常节省内存。
      2. 惰性机制。

      迭代器缺点:

      1. 不直观。
      2. 操作不灵活。
      3. 效率相对低。

      特性:

      l1 = [22, 33, 44, 55, 66, 77]
      obj = iter(l1)
      
      for i in range(3):
          print(next(obj))
      
      for i in range(2):
          print(next(obj))

      利用while循环,模拟for循环内部循环可迭代对象的机制。

      1. 先要将可迭代对象转化成迭代器。
      2. 利用next对迭代器进行取值。
      3. 利用异常处理try一下防止报错。
    3. 可迭代对象与迭代器的对比

      可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比较占用内存的数据集。

      迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操作不灵活的数据集。

     str
    # list
    # 内置函数:dir()
    # print(dir(str))
    # 判断一个对象是否是可迭代对象:
    # print('__iter__' in dir(str))
    [1,2,3]
    # {'name': 'alex'}
    # 'fdskjalfd'
    
    # 迭代器:
    # with open('调试',encoding='utf-8',mode='w') as f1:
    # #     print(f1)
    
    # print(zip('fdsa','fdsagdfsg'))  # <zip object at 0x00000000029B1D88>
    
    # 可迭代对象转化成迭代器:
    # l1 = [1, 2, 3, 4, 5]
    # # 内置函数iter()
    # obj = iter(l1)  # l1.__iter__()
    # print(obj)  # <list_iterator object at 0x0000000001DEA2E8>
    
    # 迭代器可以迭代取值。利用next()进行取值
    l1 = [1, 2, 3, 4, 5]
    # 内置函数iter()
    obj = iter(l1)
    # print(obj)
    # print(next(obj))
    # print(next(obj))
    # print(next(obj))
    # print(next(obj))
    # print(next(obj))
    # print(next(obj))
    
    # 迭代器一条路走到底,不走回头(记录位置)。
    
    l1 = [22, 33, 44, 55, 66, 77]
    obj = iter(l1)
    
    for i in range(3):
        print(next(obj))
    
    for i in range(2):
        print(next(obj))
    
    # 迭代器:
    
    # 利用while循环,模拟for循环内部循环可迭代对象的机制。
    #1,先要将可迭代对象转化成迭代器。
    #2. 利用next对迭代器进行取值。
    #3. 利用异常处理try一下防止报错。
    # try:
    #     l1 = [1,]
    #     # l1[::2]
    #     l1[100]
    #     # IndexError
    # except IndexError:
    #      pass
    # StopIteration
    # s = 'gkffdsa;lfkdsk;lafkds;laldgjfd'
    # obj = iter(s)
    # while 1:
    #     try:
    #         print(next(obj))
    #     except StopIteration:
    #         break
    #
posted on 2019-06-19 20:10  七橼77 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/-777/p/11054284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值