Python—2、对象操作

1.1、对象操作

  • 有序性

list、tuple、dict、set几种数据类型,列表和元组可以使用索引查找,所以是有序的,集合和字典(依靠键值查找)是无序的;

列表和元组的索引都是从0 开始,-1 为最后一个元素;

1.1.1、列表使用

  • 元素添加、删除、插入、清空
>>> list_c=["a","b","c","d","e"]
>>> list_c.append("f")
>>> print(list_c)
['a', 'b', 'c', 'd', 'e', 'f']
>>> del list_c[2]
>>> print(list_c)
['a', 'b', 'd', 'e', 'f']
>>> list_c.insert(3,"m")
>>> print(list_c)
['a', 'b', 'd', 'm', 'e', 'f']
>>> list_c.clear()
>>> print(list_c)
[]
  • 求列表最大、最小、长度
list_a=[1,2,3,4,5]
>>> print("list_a的最大值为:%d,最小值为:%d,长度为:%d"%(max(list_a),min(list_a),len(list_a))) 
list_a的最大值为:5,最小值为:1,长度为:5
>>>
  • list(tuple):将元组转化为列表
>>> tup_a=("a","b","c","d","e")
>>> list_b=list(tup_a)
>>> type(list_b)
<class 'list'>
>>> print(list_b)
['a', 'b', 'c', 'd', 'e']
>>>
  • 列表转字符串
column_list = [object_name,object_type,object_comments,object_ddl,creationdate,creator,modificationdate,modifier,sc_sj]

"."join(column_list)
  • 列表反转
>>> 
>>> list_a = [11,22,33,55,33,22,11,99]
>>> list_a[::-1]
[99, 11, 22, 33, 55, 33, 22, 11]
>>> list_a[-1::-1]
[99, 11, 22, 33, 55, 33, 22, 11]

说明:list[::-1] 和 list[-1::-1] 的结果一致,都是将列表元素反转;
这里有三个参数,第一个参数为 -1 表示最后一个元素,第二个元素为空表示该元素至于序列最后,第三个参数为 -1 表示步长为反向;

  • 2个列表合并
    list_a.extent(list_b)
    或者
    list_a + list_b
    说明;将 列表 list_b 的值合并到列表 list_a 中;

1.1.2、元组使用

  • 求元组最大、最小、长度
tup_a=(1,2,3,4,5)
>>> print("tup_a的最大值为:%d,最小值为:%d,长度为:%d"%(max(tup_a),min(tup_a),len(tup_a))) 
tup_a的最大值为:5,最小值为:1,长度为:5
>>>
  • tuple(list):将列表转化为元组
>>> 
>>> list_b=("a","b","c","d","e")
>>> tup_b=tuple(list_b)
>>> type(tup_b)
<class 'tuple'>
>>> print(tup_b)
('a', 'b', 'c', 'd', 'e')
>>>

1.1.2、字典使用

  • 元素修改、添加、删除、清空
>>> 
>>> dic_a={"a":"111","b":"222","c":"333","d":"444"} 
>>> dic_a["b"]="777"
>>> print(dic_a)
{'a': '111', 'b': '777', 'c': '333', 'd': '444'}
>>> dic_a["f"]="999"
>>> print(dic_a)
{'a': '111', 'b': '777', 'c': '333', 'd': '444', 'f': '999'}
>>>
>>> del dic_a["a"]
>>> print(dic_a)
{'b': '777', 'c': '333', 'd': '444', 'f': '999'}
>>> dic_a.clear()
>>> print(dic_a)
{}
>>>
  • 求字典长度
>>> dic_a={"a":"111","b":"222","c":"333","d":"444"}
>>> len(dic_a)
4
>>>

dict 在查找不存在的 key时,会抛出异常;为了避免异常,可以使用 dict.get(key,default)的方法;

  • dict.get(key,default)

  • 2个字典合并
    dict_a.update(dict_b)
    说明:将字典 dict_b 的键、值合并到字典 dict_a 中;

1.1.3、集合使用

  • 元素的添加、删除、清空
str_setC=set(("aaa","bbb","ccc","ddd"))
str_setC.add("MMM")  #集合元素添加
str_setC.remove("aaa") #集合元素删除
print("str_setC:",str_setC)
  • 元素删除的方法二:
str_setC.discard("aaa")

说明:

  • 集合是无序的,所以无法按照索引操作集合对象
>>> set_a={"aaa","bbb","ccc","ddd","eee"}
>>> set_a[3]="mmm"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support item assignment
>>>

1.1.4、字符串

1.1.4.1、repr() 使用

输出9*9口诀

>>> 
>>> for x in range(1,10):
...     for y in range(1,10):
...         print(repr(x),"*",repr(y),"=",repr(x*y).rjust(2),end=" "*3)
...     print()
... 
1 * 1 =  1   1 * 2 =  2   1 * 3 =  3   1 * 4 =  4   1 * 5 =  5   1 * 6 =  6   1 * 7 =  7   1 * 8 =  8   1 * 9 =  9   
2 * 1 =  2   2 * 2 =  4   2 * 3 =  6   2 * 4 =  8   2 * 5 = 10   2 * 6 = 12   2 * 7 = 14   2 * 8 = 16   2 * 9 = 18
3 * 1 =  3   3 * 2 =  6   3 * 3 =  9   3 * 4 = 12   3 * 5 = 15   3 * 6 = 18   3 * 7 = 21   3 * 8 = 24   3 * 9 = 27
4 * 1 =  4   4 * 2 =  8   4 * 3 = 12   4 * 4 = 16   4 * 5 = 20   4 * 6 = 24   4 * 7 = 28   4 * 8 = 32   4 * 9 = 36
5 * 1 =  5   5 * 2 = 10   5 * 3 = 15   5 * 4 = 20   5 * 5 = 25   5 * 6 = 30   5 * 7 = 35   5 * 8 = 40   5 * 9 = 45
6 * 1 =  6   6 * 2 = 12   6 * 3 = 18   6 * 4 = 24   6 * 5 = 30   6 * 6 = 36   6 * 7 = 42   6 * 8 = 48   6 * 9 = 54
7 * 1 =  7   7 * 2 = 14   7 * 3 = 21   7 * 4 = 28   7 * 5 = 35   7 * 6 = 42   7 * 7 = 49   7 * 8 = 56   7 * 9 = 63
8 * 1 =  8   8 * 2 = 16   8 * 3 = 24   8 * 4 = 32   8 * 5 = 40   8 * 6 = 48   8 * 7 = 56   8 * 8 = 64   8 * 9 = 72
9 * 1 =  9   9 * 2 = 18   9 * 3 = 27   9 * 4 = 36   9 * 5 = 45   9 * 6 = 54   9 * 7 = 63   9 * 8 = 72   9 * 9 = 81
>>>

1.1.4.2、str.formate 使用

强调:str.formate 在字符串的替换中可以直接使用,无需配合print;

>>> str_a="student name={},age={}".format("jact",13)
>>> print(str_a)
student name=jact,age=13
>>>
>>> 

A:无序参数替换

>>> print("name of dog is {},age of dog is {}".format("luka",3))     
name of dog is luka,age of dog is 3
>>> 

B:关键字参数替换

>>> 
>>> print("name of dog is {name},age of dog is {age}".format(name="luka",age=3))
name of dog is luka,age of dog is 3
>>> 

C:位置参数替换

>>> 
>>> print("the first name is {2},the second name is {1},the third name is {0}".format("Jack","luyisi","Marry"))                             
the first name is Marry,the second name is luyisi,the third name is Jack
>>>

1.1.4.3、f-string函数

>>> name="jack"
>>> age=11
>>> str_a=f"the real name of boy is {name},age is {age}"
>>> print(str_a)
the real name of boy is jack,age is 11
>>>

说明:使用 f 加到 string 左边,字符串中存在 {variable}时,变量的值将被替换为实际值;

1.1.4.4、string.encode

  • v_bytes=v_string.encode(encoding="utf8")
    说明:将字符串转换为 字节对象;

1.1.4.5、bytes.decode

  • v_string=bytes.decode(encoding="utf8")
    说明:将字节对象转换为字符串;

1.1.5、对象拷贝

对象拷贝分为直接赋值、浅拷贝、深拷贝;

  • 直接赋值
    即对象的引用,2个变量指向同一对象;

  • 浅拷贝
    拷贝父对象,不会拷贝对象的内部的子对象,即新的对象和父对象里的子对象指向同一对象;

  • 深拷贝
    copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

>>> list_f = [11,22,[33,44],55]
>>> 
>>> list_b = list_f
>>> list_c = list_f.copy()
>>> list_b,list_c
([11, 22, [33, 44], 55], [11, 22, [33, 44], 55])
>>>
>>>
>>> import copy
>>> list_d=copy.deepcopy(list_f) 
>>> list_d
[11, 22, [33, 44], 55]
>>> 

操作父类对象的一级元素和一级元素的子元素,观察新生产的对象 list_b、list_c、list_d的序列内容变化;

  • 操作父对象list_f 直接元素
>>> list_f.append(66)
>>> list_f
[11, 22, [33, 44], 55, 66]
>>> list_b
[11, 22, [33, 44], 55, 66]
>>> list_c
[11, 22, [33, 44], 55]
>>> list_d
[11, 22, [33, 44], 55]
>>>

结论:list_f父类对象新增元素,list_b为直接赋值,所以序列内容同样更改;List_c为浅拷贝,一级元素和父类对象不共享,所以不会更改;list_d为深度拷贝,和父类对象完全独立,所以序列内容不更改;

  • 操作父类对象list_f 元素的子对象
>>> 
>>> list_f[2].append(77)  
>>> list_f
[11, 22, [33, 44, 77], 55, 66]
>>> list_b
[11, 22, [33, 44, 77], 55, 66]
>>> list_c
[11, 22, [33, 44, 77], 55]
>>> list_d
[11, 22, [33, 44], 55]
>>>
>>> 

结论:list_f父类对象新增元素,list_b为直接赋值,所以序列内容同样更改;List_c为浅拷贝,元素的子对象和父类对象共享,所以同步更改;list_d为深度拷贝,和父类对象完全独立,所以序列内容不更改;

1.1.6、内存共用

  • 对象3要素

python中对象包括3要素:id(身份标识)、type(类型标识)、value(对象值);
对象3要素与3个内置函数的联系:Id&id()、Type&type()、Value&str();

约定认知:将值相同的对象理解为 “相等”,将 id()相同的对象理解为“相同”;

  • 特殊策略
    常规:每个对象被创建时就会确定其Id标识,也就是给它分配内存地址。通常新对象的内存地址也是新的,会从未分配的可用地址中取。

特殊:为了提高内存利用效率,对于一些常用的对象,如一些数值较小的数值对象、布尔值对象、None对象、较短的字符串对象等等,python采取共用对象内存的分配策略。

现象一:

>>>
>>> list_a=["aa","bb","cc",44]
>>> id(list_a)
2378731938752
>>> id(list_a.append(55))
140711091313880
>>> list_a.append(55)
>>> id(list_a) 
2378731938752
>>>

现象:step_3 得到的列表的id值和实际不同;
解释:list.append(obj)没有返回值,所以实际得到的是 None的内存地址;

>>> 
>>> id(None)
140711091313880
>>>

如下如何解释?
现象二:

>>> 
>>> n_1=2018
>>> n_2=2018
>>> id(n_1)==id(n_2)
False
>>>
>>> 
>>> n_3,n_4=2018,2018
>>> id(n_3)==id(n_4)  
True
>>>

Python中,对于整数对象,如果其值处于[-5,256]的闭区间内,则值相同的对象是同一个对象。

Python中,字符串使用Intern机制实现内存地址共用,长度不超过20,且仅包括下划线、数字、字母的字符串才会被intern;涉及字符串拼接时,编译期优化结果会与运行期计算结果不同。

1. 2、对象遍历

1.2.1、推导式

序列推导式可以加 if 条件,但是不能加 else;

1)列表推导式

语法格式:

[out_exp_res for out_exp in input_list]

[out_exp_res for out_exp in input_list if condition]

实现代码:

>>> 
>>> list_a=['aaa','bbb','ccc','ddd','eee']
>>> list_b=[x.upper() for x in list_a]
>>> print(list_b)
['AAA', 'BBB', 'CCC', 'DDD', 'EEE']
>>>

2) 集合推导式

语法格式:

{ expression for item in Sequence }

{ expression for item in Sequence if conditional }

实现代码:

>>> 
>>> set_a=set((2,4,6,8,10))
>>> set_b={x**2 for x in set_a}
>>> print(set_b)
{64, 100, 4, 36, 16}
>>>

3)字典推导式
语法格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

实现代码:

>>> 
>>> list_a=["aaa","bbb","ccc","ddd"]
>>> dict_a={x:x.upper() for x in list_a}
>>> print(dict_a)
{'aaa': 'AAA', 'bbb': 'BBB', 'ccc': 'CCC', 'ddd': 'DDD'}
>>>

4)元组推导式
语法格式:

(expression for item in Sequence )

(expression for item in Sequence if conditional )

实现代码:

在这里插入代码片

说明:元组推导式返回的结果是一个生成器对象,可以使用 tuple()将生成器转换为元组;

1.2.2、字典遍历

  • A:按照 key、value遍历
>>> dict_c={"name_1":"china","name_2":"englist","name_3":"japan","name_4":"astru"}
>>> for k,v in dict_c.items():
...     print(k,v)
... 
name_1 china
name_2 englist
name_3 japan
name_4 astru
>>>
  • B:按照key遍历
>>> 
>>> dict_c={"name_1":"china","name_2":"englist","name_3":"japan","name_4":"astru"}
>>> for i in dict_c.keys():
...     print(i,dict_c[i])
... else:
...     print("字典元素遍历结束!")
... 
name_1 china
name_2 englist
name_3 japan
name_4 astru
字典元素遍历结束!
>>>
  • C:按照 index、value遍历
>>> dict_c={"name_1":"china","name_2":"englist","name_3":"japan","name_4":"astru"}
>>> for i,v in  enumerate(dict_c):
...     print(i,v)
... 
0 name_1
1 name_2
2 name_3
3 name_4
>>>

D:按照 key 遍历

dict_0 = {"aa":"AA","bb":"BB","cc":"CC","dd":"DD","ee":"EE"}

for x in dict_0:
    print(x)


# 输出结果:

aa
bb
cc
dd
ee

Process finished with exit code 0

说明:此处直接使用该种方式,获取的元素是字段的 key 集合;

1.3、特殊对象

1.3.1、迭代器

迭代器:一种可以记住集合元素遍历位置的对象,包含两个基本的方法:iter() 和 next()。

  • 迭代是访问集合元素的一种方式,迭代器可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束;迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。
  • 字符串,列表或元组对象都可用于创建迭代器:

1)for循环输出

>>> 
>>> list_b=["aaa","bbb","ccc","ddd","eee"]
>>> l_it=iter(list_b)
>>> for x in l_it:
...     print(x)
... 
aaa
bbb
ccc
ddd
eee
>>>

2)while循环输出

import sys
list_b=["aaa","bbb","ccc","ddd","eee"]
l_it=iter(list_b)
while(True):      
    try:                     
        print(next(l_it))                    
    except StopIteration:                              
        sys.exit()

3)stopIteration异常

class MyClassH:
    def __iter__(self):
        self.b=5
        return self

    def __next__(self):
        if self.b <= 20:
            x=self.b
            self.b+=1
            return x
        else:
            raise StopIteration

myClassa = MyClassH()
itmyClassH = iter(myClassa)

for x in itmyClassH:
    print(x)  

1.3.2、生成器

生成器:在 Python 中使用了 yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数,或者说生成器就是一个迭代器。

对象遍历可以如标题 1.2.1 中的 while True 循环输出一样,也可以使用 for 循环一个个输出;

生成器代码:


def loopGener():
    i = 0
    while i < 10:
        i +=1
        yield i

1.3.3、装饰器

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

======================================= over =======================================
上一篇:Python—1、基础篇
下一篇:Python—3、函数篇

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值