• Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器


    本节内容:

    1.深浅拷贝

    2.三目运算

    3.迭代器和生成器

    4.装饰器

    1.深浅拷贝

    拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需要分两类进行考虑,一类是字符串和数字,另一类是列表、字典等。如果要进行拷贝的操作话,要import copy。

    1、数字和字符串  

      对于数字和字符串而言,深拷贝,浅拷贝没有什么区别,因为对于数字数字和字符串一旦创建便不能被修改,假如对于字符串进行替代操作,只会在内存中重新生产一个字符串,而对于原字符串,并没有改变,基于这点,深拷贝和浅拷贝对于数字和字符串没有什么区别,下面从代码里面说明这一点。

    >>> import copy
    >>>
    >>> a =2
    >>> b=copy.copy(a)    ##把a的数据复制一份给b
    >>> b
    2
    >>> b =45       ##修改b的值,查看会不会影响到a
    >>> a             ##a并不受b的影响,相互独立
    2 

    2、字典、列表等数据结构  

    对于字典、列表等数据结构,深拷贝和浅拷贝有区别,从字面上来说,可以看出深拷贝可以完全拷贝,浅拷贝则没有完全拷贝,下面先从内存地址分别来说明,假设 n1 = {"k1""wu""k2"123"k3": ["alex"456]}

            浅拷贝在内存中只额外创建第一层数据                 深拷贝在内存中将所有的数据重新创建一份

    import copy
    n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
    n2=copy.copy(n1)                               # 浅拷贝
    n3=copy.deepcopy(n1)                            # 深拷贝
    print(n1,id(n1),id(n1['k1']),id(n1['k3']))
    print(n2,id(n2),id(n2['k1']),id(n2['k3']))
    print(n3,id(n3),id(n3['k1']),id(n3['k3']))
     
    # 从下面打印的值结合上面的图就可以很好的理解,
    # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713748822024 2713753080528 2713755115656      
    # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713755121416 2713753080528 2713755115656
    # {'k3': ['alex', 456], 'k2': 123, 'k1': 'wu'} 2713753267656 2713753080528 2713754905800
    

      

    2.三目运算符

    三目运算符可以简化条件语句的缩写,可以使代码看起来更加简洁,三目可以简单的理解为有三个变量,它的形式是这样的 name= k1 if 条件 else k2 ,如果条件成立,则 name=k1,否则name=k2,下面从代码里面来加深一下理解,从下面的代码明显可以看出三目运算符可以使代码更加简洁。

    #正常判断:
    如果money大于100 happy 小于100 shit
    
    money = 100 
    if money >100 :
    	print('happy')
    else:
    	print('shit')
    	
    ##三目运算  
    print('happy') if money>100 else print('shit')
    
    #输出:
    shit
    shit
    

    3.列表生成式,迭代器&生成器 

    http://www.cnblogs.com/alex3714/articles/5765046.html

    4.装饰器

    http://www.cnblogs.com/alex3714/articles/5765046.html

    user_list = [{'name':'crik','password':123},{'name':'alex','password':456}]
    current_user = {'name':None,'password':None}
    def login_type(type):
        def login(func):
            print('type',type)
            def inner():
                if type == 'file_type':
                    if current_user['name'] and current_user['password']:
                        for item in user_list:
                            if item['name'] == current_user['name'] and item['password'] == current_user['password']:
                                print('login...')
                                func()
                                return
                    else:
                        name = input('plz input name:').strip()
                        password = int(input('plz input password:').strip())
                        current_user['name'] = name
                        current_user['password'] =password
                        for item in user_list:
                            if item['name'] == current_user['name'] and item['password'] == current_user['password']:
                                print('login...')
                                func()
                                return
                        else:
                            current_user['name'] = None
                            current_user['password'] = None
                            print('验证失败')
                            return '验证失败'
                elif type == 'ldap':
                    print('use ldap')
                    return
                else:
                    print('unknow type')
            return  inner
        return login
    
    @login_type('ldap')   ##实际就是   index = login_type('ldap') -- > index = login  -->index = inner
    def index():
        print('welcome to home...')
    
    @login_type('ss')
    def look():
        print('female')
    
    
    index()
    
    look()
    
    # 输出结果:
    # type ldap
    # type ss
    # use ldap
    # unknow type
  • 相关阅读:
    Day 29 作业/服务端实现接收客户端的连接并发
    Day 28 操作系统发展/进程
    Day 27 作业(FTP)
    Day 27 subprocess模块/粘包问题以及解决/UDP协议/socketserver
    Day 26 作业
    Day 26 互联网协议/Socket套接字
    Day 22 绑定方法和非绑定方法/isinstance/issubclass/反射/魔法方法/单例模式
    Day 21 作业
    Day 21 组合/封装/property特性/多态和多态性/抽象类/鸭子类型
    day 20 作业
  • 原文地址:https://www.cnblogs.com/hero799/p/8578538.html
Copyright © 2020-2023  润新知