美文网首页
Python基础

Python基础

作者: bjchenli | 来源:发表于2017-03-09 11:59 被阅读0次

    python转义字符:\

    python用r' '表示' '默认不转义
    示例:
    print(r'\\\t\\')
    结果:
    \\\\\t\\\
    python用%%来表示一个%

    如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容。
    示例
    print('''line1 ... line2 ... line3'')
    结果
    line1 line2 line3
    上面是在交互式命令行内输入,注意在输入多行内容时,提示符由>>>变为...,提示你可以接着上一行输入。

    由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。
    Python对bytes类型的数据用带b前缀的单引号或双引号表示:
    x = 'ABC'
    要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
    以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
    x = 'ABC'.encode("ascii") y = '中文'.encode('utf-8') z = '中文'.encode('ascii')//含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。 print('x=',x, 'y=',y, )
    结果:
    x= b'ABC' y= b'\xe4\xb8\xad\xe6\x96\x87'
    纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

    如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
    x = b'ABC'.decode('ascii') y = b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') print('x=',x, 'y=',y, )
    结果:
    x= ABC y= 中文

    len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
    a = len(b'ABC') b = len('ABC') c = len(b'\xe4\xb8\xad\xe6\x96\x87') d = len('中文'.encode('utf-8')) print(a, b, c, d)
    结果:
    3 3 6 6
    可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

    由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

    第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

    1.list

    Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。
    比如,列出班里所有同学的名字,就可以用一个list表示:
    classmates = ['chenli', 'yyy', 'haha']//方括号是list,可以更改 print(classmates)
    结果:
    ['chenli', 'yyy', 'haha']
    如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:
    classmates = ['chenli', 'yyy', 'haha'] print(classmates[-1])
    结果:
    haha
    list是一个可变的有序表,所以,可以往list中追加元素到末尾:
    也可以把元素插入到指定的位置,比如索引号为1的位置:
    要删除list末尾的元素,用pop()方法:
    要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
    示例:
    classmates = ['chenli', 'yyy', 'haha'] print(classmates) x = len(classmates) print(x) classmates.append('wangwu')//在list末尾追加元素 print(classmates) classmates.insert(1, 'zhangsan')//在list指定位置增加元素 print(classmates) classmates.pop()//删除list末尾的元素 print(classmates) classmates.pop(2)//删除list指定位置的元素 print(classmates)
    结果:
    ['chenli', 'yyy', 'haha'] 3 ['chenli', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha'] ['chenli', 'zhangsan', 'haha']
    list元素也可以是另一个list,比如:
    classmates = ['chenli', 'yyy', 'haha'] print(classmates) a = ['hh', classmates, 'dayouzi'] print(a)
    结果:
    ['chenli', 'yyy', 'haha'] ['hh', ['chenli', 'yyy', 'haha'], 'dayouzi']
    要拿到'yyy'可以写classmates[1]或者a[1][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。
    示例:
    [chenli', 'yyy', 'haha'] yyy yyy

    2、tuple

    另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:
    classmates = ('chenli', 'yyy', 'haha')//圆括号是tuple,不能更改 print(classmates)
    结果:
    ('chenli', 'yyy', 'haha')
    现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。
    不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
    但是,要定义一个只有1个元素的tuple,如果你这么定义:
    a = (1) print(a)
    结果:
    1
    这里的1是数字1,不是定义的tuple。要是定义只有一个元素的tuple,应该在元素后面加一个逗号,防止歧义。
    a = (1,) print(a)
    结果:
    (1,)
    最后来看一个“可变的”tuple:
    t = ('a', 'b', ['A', 'B']) print(t) t[2][0] = 'X' t[2][1] = 'Y' print(t)
    结果:
    ('a', 'b', ['A', 'B']) ('a', 'b', ['X', 'Y'])
    这个tuple定义的时候有3个元素,分别是'a','b'和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了?
    别急,我们先看看定义的时候tuple包含的3个元素:

    tuple-0
    当我们把list的元素'A'和'B'修改为'X'和'Y'后,tuple变为:
    tuple-1
    表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向'a',就不能改成指向'b',指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的!
    理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。
    3、条件判断

    if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4>

    if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elif和else,所以,请测试并解释为什么下面的程序打印的是teenager:
    age = 20 if age >= 6: print('teenager') elif age >= 18: print('adult') else: print('kid')
    结果:
    teenager
    if判断条件还可以简写,比如写:
    x = 20 if x: print(True)
    结果:
    True
    input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情:
    只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。

    3、循环

    python有两种循环,第一种是for...in 循环,依次把list或tuple中的每个元素迭代出来。
    sum = 0 for x in list(range(101)): sum += x print(sum)
    结果:
    5050
    如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数。
    第二种循环是while循环,只要条件满足,就不断循环,条件不满足时退出循环。
    total = 0 n = 100 while n > 0: total += n n = n - 1 print(total)
    结果:
    5050

    4、dict
    Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

    要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:
    二是通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:
    # -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d['YYU']) print('wangwu' in d) print(d.get('wangwu', -1))
    结果:
    99 False -1
    要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
    # -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d) d.pop('chenli') print(d)

    结果:
    {'chenli': 90, 'HAH': 80, 'YYU': 99} {'HAH': 80, 'YYU': 99}
    请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。

    和list比较,dict有以下几个特点:

    查找和插入的速度极快,不会随着key的增加而变慢;
    需要占用大量的内存,内存浪费多。
    

    而list相反:

    查找和插入的时间随着元素的增加而增加;
    占用空间小,浪费内存很少。
    

    所以,dict是用空间来换取时间的一种方法。

    dict可以用在需要高速查找的很多地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。

    5、set

    set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
    要创建一个set,需要提供一个list作为输入集合:
    # -*- coding: utf-8 -*- s = set([1, 2, 3]) print(s)
    结果:
    {1, 2, 3}
    注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
    重复元素在set中自动被过滤:
    # -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) print(s)
    结果:
    {1, 2, 3, 4}
    通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:
    通过remove(key)方法可以删除元素:
    set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
    # -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) s1 = set([1, 2, 3, ]) print(s) s.add(6) print(s) s.remove(3) print(s) s2 = s print(s1 & s2) print(s1 | s2)
    结果:
    {1, 2, 3, 4} {1, 2, 3, 4, 6} {1, 2, 4, 6} {1, 2} {1, 2, 3, 4, 6}

    相关文章

      网友评论

          本文标题:Python基础

          本文链接:https://www.haomeiwen.com/subject/xzsbgttx.html