Python 3.7.1 学习

2018-11-28  本文已影响73人  木槿惜年2013

易混淆点总结

1. / 和//和%的区别

2. 用python计算n ** b的值,如 5 ** 2 = 5 * 5 = 25

图片.png

3. 对浮点数有完整的支持

在整数和浮点数的混合计算中,整数会被转换为浮点数计算:


图片.png

4. 分割字符串

字符串也可以被截取(检索)。类似于C,字符串的第一个字符索引为0.Python没有单独的字符类型;一个字符就是一个简单的长度为1的字符串。
  举例:

图片.png

注意:
  * 字符串的索引也可以是负数,若为负数则从右边开始计算
  * -0实际上就是0,所以-0不会导致从右边开始计算

5. 字符串取子串

索引用于获得单个字符串,切片让你获得一个子字符串
  举例:

图片.png

注意:
   * 字符串切片包含起始的字符,不包含末尾的字符。这使得 s[:i] + s[i:]永远等于s

6. 格式化字符串

1)Python-3.7.1相对于Python-3.6新增的 【Formatted string literals】

字符串文字 功能 描述
!s str() 在结果中调用str()函数
!r repr() 在结果中调用repr()函数
!a ascii() 在结果中调用ascii()函数
ord('\n') 获取'\n'的ASCII值
  1. f格式化字符串示例,如图【f格式化字符串示例】所示


    图片.png
  1. 注意事项

7. For语句

注意:
在迭代过程中修改迭代序列不安全,推荐的做法是为:
如果你想要修改你迭代的序列(例如,复制选择项),你可以迭代它的复本。使用切割标识就可以很方便的做到这一点,如下代码所示:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

if __name__ == "__main__":
    words = ["red", "yellow", "green", "black", "orange"]
    for elem in words[:]:  #循环遍历整个列表的切片副本
        if len(elem) > 5:
            words.insert(0, elem)

    print(words)

结果:

图片.png

8. 特殊语句------循环中的else子句

与循环一起使用时,else 子句与 try 语句的 else 子句比与 if 语句的具有更多的共同点:try 语句的 else 子句在未出现异常时运行,循环的 else 子句在未出现 break 时运行

#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == "__main__":
    for n in range(2, 10):
        for x in range(2, n):
            if n % x == 0:
                print(n, 'equals', x, '*', n//x)
                break
        else:  #注意:此else语句是属于for循环之中,不是if语句的
            # 循环没有找到一个因素,则当前n为素数
            print(n, 'is a prime number')

结果:
  

图片.png

9. 参数列表分拆

当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来。例如内建函数 range() 需要要独立的 start,stop 参数。你可以在调用函数时加一个 * 操作符来自动把参数列表拆开,如图【用*分拆list】所示:

   图片.png

以同样的方式,可以使用 ** 操作符分拆关键字参数为字典,如下代码所示:

  #!/usr/bin/env python
# -*- coding: utf-8 -*-

if __name__ == "__main__":
    def parrot(voltage, state='a stiff', action='voom'):
        print("--This parrot wouldn't", action, end=' ')
        print("if you put", voltage, "volts through it.", end=' ')
        print("E's", state, "!")

    d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
    parrot(**d)

输出结果,如图【输出结果】所示:

   图片.png

10. 关于列表的常见方法(未完全列出)

1) list.remove(x)
  删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误
  2) list.pop([i])
  从列表的指定位置删除元素,并将其返回。如果没有指定索引,a.pop() 返回最后一个元素。元素随即从列表中被删除(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在Python 库参考手册中遇到这样的标记)
  3) list.clear()
  从列表中删除所有元素。相当于 del a[:]
  4) list.index(x)
  返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。
  5) list.count(x)
  返回 x 在列表中出现的次数
  6) list.copy()
  返回列表的一个浅拷贝。等同于 a[:]

11. 列表推导式

列表推导式由包含一个表达式的括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句。结果是一个列表,由表达式依据其后面的 for 和 if 子句上下文计算而来的结果构成
  例如,如下的列表推导式结合两个列表的元素,如果元素之间不相等的话,就把俩元素按(a,b)的形式存入list中:

   图片.png

等同于:

   图片.png

12. zip()函数

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
  注:zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

   图片.png 图片.png

13. 集合

集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持 union(联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。
  创建集合:大括号或 set() 函数可以用来创建集合。
  注:想要创建空集合,必须使用set()而不是{}。后者用于创建空字典。
  示例:

   图片.png

集合的推导式语法:

   图片.png

14. 字典

python 3.7.1 和 python 3.6.3 之间的不同处
  需求: 返回一个字典中所有关键字组成的无序列表
  在python 3.6.3中采用的方法是:对一个字典执行 list(d.keys()),如下截屏所示:
  

图片.png

在python 3.7.1中采用的方法是: 对一个字典执行 list(d)如下截屏所示:
  注:python 3.7.1 兼容python 3.6.3的方法(即用python 3.6.3的方法,在python 3.7.1中不会报错)

   图片.png

需求: 返回一个字典中所有关键字组成的列表,并对此列表排序
  在python 3.6.3中采用的方法是:对一个字典执行 sorted(d.keys()) ,如下截屏所示:
  

图片.png

在python 3.7.1中采用的方法是: 对一个字典执行 list(d)如下截屏所示:
  注:python 3.7.1 兼容python 3.6.3的方法(即用python 3.6.3的方法,在python 3.7.1中不会报错)

   图片.png

字典中的小技巧:
  1) dict() 构造函数可以直接从 key-value 对中创建字典
  

图片.png

2) 字典推导式可以从任意的键值表达式中创建字典

   图片.png

3) 如果关键字都是简单的字符串,有时通过关键字参数指定 key-value 对更为方便

>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> 

15. 循环技巧

1) 在字典中循环时,关键字和对应的值可以使用 items() 方法同时解读出来:

>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
...     print(k, v)
... 
gallahad the pure
robin the brave
>>> 

2) 在列表循环时,索引位置和对应值可以使用 enumerate() 函数同时得到:

>>> for i, v in enumerate(['tic', 'tac', 'toe']):
...     print(i, v)
... 
0 tic
1 tac
2 toe
>>> 

3) 同时循环两个或更多的列表,可以使用zip()整体打包:

>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
...     print('What is your {0}?  It is {1}.'.format(q, a))
... 
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.
>>> 

16. 深入条件控制

比较操作符可以传递。例如a < b == c审核是否a小于b并且b等于c

>>> a,b,c = 1,2,2
>>> if a < b == c :
...     print(True)
... else:
...     print(False)
... 
True
>>> 

17. 性能度量

例如,使用元组封装和拆封来交换元素看起来要比使用传统的方法要诱人的多。timeit 证明了后者更快一些:

>>> from timeit import Timer
>>> Timer('t=a;a=b;b=t','a=1;b=2').timeit()
0.021459163981489837
>>> Timer('a,b=b,a','a=1;b=2').timeit()
0.01870661400607787
>>> 

相对于 timeit 的细粒度,profile 和 pstats 模块提供了针对更大代码块的时间度量工具。
  
参考文档:
http://www.pythondoc.com/pythontutorial3/datastructures.html
https://docs.python.org/3/tutorial/datastructures.html

上一篇下一篇

猜你喜欢

热点阅读