zoukankan      html  css  js  c++  java
  • 函数中的陷进,定义全局变量以及可迭代对象和迭代器

    默认参数的陷阱

    默认参数为不可变类型(无陷阱)

    默认参数为可以变类型

    如果你的默认参数指向可变的数据类型,那么你无论调用多少次这个默认参数.都是同一个
    
    def a(b,c=[]):
        c.append(b)
        return c
    ret1 = a("alex")
    print(ret1,id(ret1))        #---> 结果:['alex'] 2882348361928
    ret2 = a("天天")
    print(ret2,id(ret2))        #---> 结果:['alex', '天天'] 2882348361928
    print(globals())
    
    现象:ret2并没插入alex 但列表还是任有alex
    

    局部作用域的陷阱

    如果你在全局作用域定义了一个变量,并且在函数中如果你定义相同变量名的一个变量,但是在定义这个变量之前对其引用,那么解释器认为你这是语法问题.解释器认为你应该在使用之前定义.

    count = 1
    def func():
        print(count)
        count = 3
    
    func()
    
    现象:如果函数内不定义count变量则不会报错,函数内定义的变量误导了函数
    

    global nonlocal

    global

    - 在局部作用域声明(创建)一个全局变量
    - 修改一个全局变量
    
    def s():
        global ts
        ts=[1,2,3,4]
        print(ts)
    s()
    print(ts)
    

    nonlocal

    - 不能操作全局变量.
    - 局部作用域内: 内存函数对外层函数的局部变量进行修改时使用
    
    def s():
        nonlocal ts
        ts=[1,2,3,4]
        print(ts)
    s()
    print(ts)
    

    函数名运用

    函数名指向的是函数的内存地址
    
        - 函数名+()就可以执行此函数(因为函数名指向的内存地址)
        - 函数名可以作为容器类数据类型的元素.
        - 函数名可以作为函数的参数
        - 函数名可以作为函数的返回值
      
    

    迭代器

    可迭代对象

    对象:python 一切皆对象.一个实实在在存在的值,对象.
    迭代:重复,类似于循环的一个过程.更新迭代每次都有新的内容.
    
    可迭代对象:可以循环更新的一个实实在在的值.
    
    专业角度:
    	内部含有"__iter__"方法的对象就是可以迭代对象
    	
    常见的可迭代对象:str list tuple dict set range 文件句柄
    

    查看对象的所有方法

    dir() 
    	获取括号内为你需要查看对象的所有方法
    
    判断一个对象是否是可迭代对象:
    	s1 = range(10)
    	if "__iter__" in dir(s1):
    	    print("是可迭代对象")
    	else:
    	    print("别闹")
    

    可迭代对象小结

    - 字面意思:一个实实在在存在的值,对象.
    - 专业角度:使用方法内部含有"__iter__"方法的对象,可以迭代对象
    - 判断一个对象是否为可迭代对象:  使用in  
    - 可迭代对象优点:(str list tuple dict set range)
      - 存储的数据能直接显示,比较直观
      - 拥有的方法比较多
    - 可迭代对象缺点:(str list tuple dict set range)
      - 占用内存
      - 不能直接通过for循环,不能直接取值.(索引,key除外)  **通过for循环能取值是因为内部转换为迭代器**
    

    迭代器

    什么是迭代器

    - 字面意思:迭代:更新迭代   器:工具     	可更新迭代的工具 
    - 专业角度:内部含有"__iter__"并且含有"__next__"方法的对象就是迭代器
    

    判断一个对象是否是迭代器

    	with open("a.txt",mode="w",encoding="utf -8") as f:
    	    f.write("aaaa")
    	print("__iter__" in dir(f)and "__next__" in dir(f))
    

    从迭代器中取值的三种方法

     print(next(obj))    #显示迭代器的值另一种:obj.__next__()     一个next对应一个值
     
     print(list(obj))    #将迭代器内容放在列表里返回
     
     for i in obj:
     	print(i)       #通过for循环将迭代器内内容一条一条返回
    

    可迭代对象如何转换成迭代器

    	 s1 = "dsadasdsad"
    	 obj = iter(s1)   # 另一种方法:s1.__iter__()      转化成迭代器
    

    while循环模拟for循环机制

    	li = [11,22,33,44,55]
    	obj = iter(li)
    	while 1:
    	    try:
    	        print(next(obj))
    	    except StopIteration:       #当报错为StopIteration(超出取值范围)
    	        break                       #跳出循环
    

    迭代器小结

    - - 字面意思:迭代:更新迭代   器:工具     	可更新迭代的工具 
      - 专业角度:内部含有"__iter__"并且含有"__next__"方法的对象就是迭代器
      - 迭代器的优缺点:
        - 优点:节省内存,惰性机制(next一次,取一个值,绝不多取)
        - 缺点:速度要慢.不走回头路.
    - 可迭代对象与迭代器的对比
      - 可迭代对象
        - 是一个操作方法比较多,比较直观存储数据相对少(几百万个数据对象,8G内存可以承受.)的一个数据集.
        - 当你侧重于对数据可以灵活处理,并且内存空间足够.可以将数据设置为可迭代对象进行操作.
      - 迭代器
        - 当你数据量过大,达到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择
          #今日总结
    - 默认参数的陷阱(默认参数为可变类型)
    - 局部作用域的坑(先引用变量,后定义变量)
    - 格式化输出
    - 函数名的应用
    - 对比:迭代器是什么?迭代器的优缺点.
    - 可迭代对象如何转化成迭代器
    
  • 相关阅读:
    C++ 命名管道示例
    C#模块初始化注入
    【Oracle】存储过程写法小例子
    【Kettle】4、SQL SERVER到SQL SERVER数据转换抽取实例
    【Kettle】3、数据源连接配置
    【Kettle】2、文件夹与界面介绍
    【Kettle】1、简单介绍
    【Kettle】8、变量参数传递介绍
    【Oracle】DBMS_STATS.GATHER_TABLE_STATS详解
    【Oracle】DBMS_STATS.GATHER_SCHEMA_STATS详解
  • 原文地址:https://www.cnblogs.com/luyi84895838/p/11726714.html
Copyright © 2011-2022 走看看