zoukankan      html  css  js  c++  java
  • python学习笔记6基本对象和流程语句整理

    一:标准类型的分类
    * “基本”,是指这些类型都是Python 提供的标准或核心类型。
    * “内建”,是由于这些类型是Python 默认就提供的
    * “数据”,因为他们用于一般数据存储
    * “对象”,因为对象是数据和功能的默认抽象
    * “原始”,因为这些类型提供的是最底层的粒度数据存储
    ?? “类型”,因为他们就是数据类型
    1、存储模型
    我们对类型进行分类的第一种方式, 就是看看这种类型的对象能保存多少个对象。Python
    的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。
    一个能保存单个字面对象的类型,我们称它为原子或标量存储,
    那些可容纳多个对象的类型,我们称之为容器存储
    存储模型
    分类 Python 类型
    标量/原子类型 数值(所有的数值类型),字符串(全部是文字)
    容器类型 列表、元组、字典

    2、更新模型
    另一种对标准类型进行分类的方式就是, 针对每一个类型问一个问题:“对象创建成功之
    后,它的值可以进行更新吗?” 在前面我们介绍Python 数据类型时曾经提到,某些类型允许
    他们的值进行更新,而另一些则不允许。可变对象允许他们的值被更新,而不可变对象则不允许他们的值被更改。
    更新模型
    分类 Python 类型
    可变类型 列表, 字典
    不可变类型 数字、字符串、元组

    3、访问模型
    尽管前面两种模型分类方式在介绍Python 时都很有用,它们还不是区分数据类型的首要模
    型。对这种目的,我们使用访问模型。也就是说根据访问我们存储的数据的方式对数据类型进
    行分类。在访问模型中共有三种访问方式:直接存取,顺序,和映射。
    访问模型
    分类 Python 类型
    直接访问 数字
    顺序访问 字符串、列表、元组
    映射访问 字典

    二、对象类型
    1、数字
    数字:不可变
    2、字符串
    字符串:不可原处修改【修改需要创建新的对象】,有顺序,支持求长(len),合并(+),重复(*),索引S[0],分片(S[1:3]],成员测试(in),迭代(for);
    特有的查找find,替换replace,拆分split;支持list(S)将字符串分解成一个字符列表,tuple(S)将字符串分解成一个字符组成的元组,复制可用分片和copy标准库,
    不支持排序sort和删除del(因为不可原处修改)
    3、元组
    元组:不可以原处修改,有顺序,支持求长(len),合并(+),重复(*),索引T[0],分片T[2:-1],成员测试(in),迭代(for) ,可以嵌套列表,字典,元组,
    支持list(T)将元组转换列表,转换的时候生成新的对象。 复制可用分片和copy标准库;不支持排序sort和删除del(不可变)【没有方法】
    注意:元组的不可变性只适用与元组本身顶层而非其内容,元组的内部的列表,字典可以像往常那样修改。
    4、列表
    列表:可在原处修改,有顺序,支持求长(len),合并(+),重复(*),索引L[0],分片L[0:3],成员测试(in),迭代(for),包含任何对象,可以嵌套列表,字典,元组。
    可变体现在支持 增加单个对象:L.append(4),增加多个对象:L.extend([5,6,7]),在I位置插入X:L2.insert(I,X),索引赋值:L2[i]=1,分片赋值:L2[i:j]=[4,5,6]
    移除数据(参数对象):L.remove('b'),移除数据(参数序列) :L.pop(1),裁剪索引:del L[K],裁剪分片del L[i:j],裁剪列表:del L,
    排序:L2.sort(),顺序反转:L.reverse(),通过对象查找对象索引(和索引相反的操作):L.index('abc'),复制可用分片和copy标准库
    支持rang(起,始,步进)创建列表
    支持list(L)本身
    可以将列表转换为元组:T=tuple(L)#转换的时候生成新的对象.
    可以将元组转换为列表:list(T)#产生新的列表对象
    不能先创建空列表再添加元素。

    列表解析
    >>> L=[1,2,3,4,5]
    >>> L=[x+10 for x in L]
    将列表中行的换行符去掉
    >>> lines=[line.rstrip() for line in lines]
    >>> lines=[line.rstrip() for line in open('/etc/rc.conf')]
    扩展列表解析
    重复上一个例子,但我们只需开头不为#的文字行。
    >>> lines=[line.rstrip() for line in open('/etc/rc.conf') if line[0]!='#']
    完整的语句可接纳任意数目的for分句,而每个分区都可以结合一个可选的if分句
    >>> [x+y for x in 'abc' for y in 'lmn']
    ['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']
    对一个字符串中的每个x,以及另一个字符串中的每个y,创建x+y合并的列表。收集两个字符串字符的排列组合

    5、字典
    字典:可在原处修改[通过键修改],无顺序,支持求长(len),索引D['name'],成员测试(in),迭戈(for)(keys,values方法返回的列表支持),del D[’name'],del D,
    不支持合并,重复,分片,包含任何对象,可以嵌套列表,字典,元组。 不支持排序sort.
    支持list(D),获取字典KEY的列表 复制可用.Dcopy(),copy标准库
    可以创建空字典,然后再添加元素.
    >>> D={}
    >>> D={'one':1}
    >>> D
    {'one': 1}
    列表不能通过这样的方法来增加数据,列表只能通过append方法,列表之能通过L[1]='A'这样的方法来修改已存在序列的数据。

    6、对比
    对象灵活性
    * 列表,字典,元组可以包含任何种类的对象。
    * 列表,字典,元组可以任意嵌套
    * 列表,字典可以动态扩大和缩小。
    有些地方的确需要拷贝,那么可以明确要求
    * 没有限制条件的分片表达式(L[:])能够赋值序列
    * 字典copy方法(D.copy())能够复制字典
    * 有写内置函数(例如,List)能够生产拷贝(list(L))
    * copy标准库模块能够生成完整拷贝

    三、赋值表达式和打印
    1、赋值运算
    变量命名规则
    语句:(下划线或者字母)+(任意数目的字母,数字或下划线)
    注意:区分大小写,禁止使用保留字,前后有下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊意义
    变量名没有类型,但对象有

    运算 解释
    diege='diege' 基本形式
    diege,lily='yum','wang' 元组赋值运算(位置性) 序列赋值语句
    [diege,lily]=['yum','YUM'] 列表赋值运算(位置性) 序列赋值语句
    a,b,c=string[0],string[1],string[2] 高级赋值
    ((a,b),c)=('DI','GE') 可以赋值嵌套序列
    a,b,c,d='dieg' #序列赋值运算,通用性 #MS不行,数量要一致。 序列赋值语句
    name=uname='diege' 多目标赋值运算
    diege += 43 增强赋值运算(相当于diege=diege+43)
    2、表达式语句介绍
    在Python中可以使用表达式作为语句 (本身只占一行)。但是,因为表达式结果不会被存储,只有当表达式工作并作为附加的效果,这样才有意义。
    通常在两种情况下表达式用作语句。
    *调用函数和方法
    有些函数和方法会做很多工作,而不会返回值,这种函数在其他语言中有时称为流程。因为他们不会返回你可能想保留的值,所以你可以用表达式语句调用这些函数。
    *在交互模式提示符下打印值
    常见的python表达式语句
    运算 解释
    spam(eggs,ham) 函数调用
    spam.ham(eggs) 方法调用
    spam 在交互模式解释器内打印变量
    spam < ham and ham != eggs 符合表达式
    spam < ham < eggs 范围表达式
    注意:虽然表达式在python中可以作为语句出现,但语句不能作为表达式。

    表达式语句和在原处修改
    对列表调用append,sort,reverse这类在原处修改的元算,一定是对列表在原处的修改,但这些方法在列表修改后并不会把列表返回。

    3、打印
    >>>print 'diege,test' #把对象打印至sys.stdout,在元素之间增加一个空格,以及在末尾增加换行符。
    >>> name='diege'
    >>> age=18
    >>> print 'my name is:%s age is:%s'%(name,age)
    my name is:diege age is:18

    print x 等价于
    import sys
    sys.stdout.write(str(x)+'\n'
    当print 语句以>>开始,后面再跟着输出的文件对象(或其他对象)时,该print语句可以将文字传给该对象的write方法,但是不用重设sys.stdout。因为这种重定向是暂时的。普通的print语句还是会继续打印到原始的输出流的。
    >>> log=open('log.txt','a',0)
    >>> x,y,z=10,11,12
    >>> print >> log,x,y,z
    >>> print >> 输出的文件,输入,的,内容

    四、流程语句
    1、while循环
    while <test>:
    <statements1>
    if <test2>:break
    if <test3>:continue
    if <test4>:pass
    else:
    <statements2>
    break
    跳出最近所在的循环(跳出整个循环语句)
    continue
    跳到最近所在循环的开头处(来到循环的首行,跳过本次循环)
    pass
    什么事也不做,只是空占位语句
    循环else块
    只有当循环正常离开时才会执行(也就是没有碰到break语句)
    2、for循环
    for循环在Python中是一个通用的序列迭代器:可以遍历任何有序的序列对象内的元素。for语句可用于字符串,列表,元组,其他内置可迭代对象以及之后我们能够通过类所创建的新对象。
    for循环的首行定义了一个赋值目标(或【一些目标】),以及你想遍历的对象,首行后面是你想重复的语句块(一般都有缩进)
    当ptyhon运行for循环时,会逐个将序列对象中的元素赋值给目标,然后为每个元素执行循环主体。
    for <target> in <object>:
    <statements>
    if <test>:break
    if <test>:conitnue
    else:
    <statements>
    可以多层嵌套
    三元表达式

    A=Y if X else Z
    只有当X为真时才会执行表达式Y,而只有当X为假时,才会执行表达式Z

    3、迭代器
    for循环可以用在任何【可迭代的对象】。这些迭代工具包括了for循环,列表解析,in成员关系测试,以及map内置函数等。
    next()文件迭代方法,无需将文件读取。
    逐行读取文本的最佳方式就是根本不要去读取,其替代的方法就是,让for循环在每轮自动调用next从而前进到下一行
    >>> for line in open('/etc/rc.conf'):
    ... print line.upper(),
    字典迭代
    >>> for key in D:
    ... print key,D[key]
    其他迭代环境
    列表解析
    [line.upper() for line in open('/etc/rc.conf')]
    in成员关系
    map内置函数以及其他内置工具(如sorted,sum)
    map(str.upper,open('/etc/rc.conf'))
    >>> sorted(open('/etc/rc.conf')) #这个工具排序了,较新的内置函数,采用了迭代协议。应用于任何可迭代的对象上。
    >>> sum([3,5,6,9]) #sum调用会计算任何可迭代对象内所有数字的和
    23
    list和tuple内置函数(从可迭代对象创建新的对象),字符串join方法(在可迭代对象内字符串之间放入子字符串),以及序列赋值语句等。
    >>> list(open('/etc/rc.conf'))
    >>> tuple(open('/etc/rc.conf'))
    >>> '&&'.join(open('/etc/rc.conf'))
    >>> a,d,c,d=open('/etc/rc.conf')
    4、编写循环的技巧
    遍历序列时,首选for循环,for循环包括多数计数器式的循环,for比while容易写,执行时也比较快。
    Python提供了两个内置函数,在for循环内定制迭代:
    * 内置range函数返回连续整数列表,可作为for中的索引。
    >>> range(5,10,2)
    [5, 7, 9]
    >>> range(5,-5,-1)
    [5, 4, 3, 2, 1, 0, -1, -2, -3, -4]
    尽量使用简单的for循环,不要用while,并且不要在for循环中使用range调用,只将其视为最后的选择,更简单的办法总是更好。
    >>> for i in X:
    ... print i
    for x in S[::2]:print x# 步长2的
    *内置 zip函数返回并行的元素元组的列表,可用于在for中遍历数个序列
    并行遍历:zip 和map
    >>> L1=[1,2,3,4]
    >>> L2=[5,6,7,8]
    >>> zip(L1,L2)
    [(1, 5), (2, 6), (3, 7), (4, 8)]
    >>> for (x,y) in zip(L1,L2):
    ... print x,y,'--',x+y
    当参数长度不同时,zip会以最短序列的长度为准来截断所得到的元组:
    内置map函数,用类似的方式把序列的元素配对起来,但是如果参数长度,不同则会为较短的序列用None补齐。
    >>> map(None,S1,S2)
    [('A', 'x'), ('B', 'y'), ('C', 'z'), (None, '1'), (None, '2'), (None, '3')]
    使用zip构造字典
    >>> keys=['name','age','class']
    >>> vals=['diege',18,2012]
    >>> dict(zip(keys,vals))
    {'age': 18, 'name': 'diege', 'class': 2012}
    >>> D5=dict(zip(keys,vals))
    enumerate内置函数,同时产生偏移和元素
    >>> S='diege'
    >>> for (offset,item) in enumerate(S):
    ... print item,offset
    ...
    d 0
    i 1
    这个方法有个next方法,每次遍历列表时,会返回一个(index,value)的元组,而我们能在for中通过元组赋值运算将其分解。
    >>> E=enumerate(S)
    >>> E.next()
    (0, 'd')
    >>> E.next()
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    StopIteration
    5、列表解析
    列表解析是写在方括号中的,因为它毕竟是一种创建新的列表的方式。
    [【表达式】 for x in L【for循环行首】]
    列表解析
    >>> L=[1,2,3,4,5]
    >>> L=[x+10 for x in L]
    将列表中行的换行符去掉
    >>> lines=[line.rstrip() for line in lines]
    >>> lines=[line.rstrip() for line in open('/etc/rc.conf')]
    扩展列表解析
    重复上一个例子,但我们只需开头不为#的文字行。
    >>> lines=[line.rstrip() for line in open('/etc/rc.conf') if line[0]!='#']
    完整的语句可接纳任意数目的for分句,而每个分区都可以结合一个可选的if分句
    >>> [x+y for x in 'abc' for y in 'lmn']
    ['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']
    对一个字符串中的每个x,以及另一个字符串中的每个y,创建x+y合并的列表。收集两个字符串字符的排列组合

    五、文档
    dir函数:对象中可用属性的列表
    文档字符串:__doc__ 附加在对象上文件中的文档。
    PyDoc:help函数 对象的交互帮助
    PyDoc:HTML报表 浏览器中的模块文档
    标准手册 正式的语言和库的说明
    1、dir函数
    >>> import sys
    >>> dir(sys)
    dir([]) 和dir(list) 等效
    dir(()) 和dir(tuple)
    dir({}) 和dir(dict)
    dir('') 和dir(str)等效
    2、__doc__ 对象文档
    将注释写成字符串,放在模块文件,函数以及类句的顶端,就再任何可执行程序代码前。python会自动封装这个字符串。也就是文档
    字符串,使其成为相应对象的__doc__属性
    放在函数顶端
    '''
    对象文档存放位置
    '''
    显示办法

    >>> print list.__doc__
    list() -> new empty list
    list(iterable) -> new list initialized from iterable's items
    3、help()函数
    >>> import sys
    >>> help(sys.getrefcount)
    4、常见的代码陷阱
    别忘了冒号
    从第1行开始
    缩进要一致
    不要在python写C代码
    使用简单的for循环,而不是while或range
    注意赋值语句中的可变对象
    不要期待进行在原处修改的函数会返回结果。如list.append,list.sort
    一定要使用括号调用函数
    不要在导入和重载中使用扩展名或路径

  • 相关阅读:
    SpringBoot和SpringCould的关系
    MyBatis全局配置文件头
    MyBatis的SQL映射文件头
    MyBatis 驼峰式配置 yml配置
    频率组件
    序列化和反序列化
    生成器面试题
    序列化组件
    进程间通信IPC机制
    信号量、event事件和线程queue
  • 原文地址:https://www.cnblogs.com/diege/p/2677840.html
Copyright © 2011-2022 走看看