Python_07_官方文档


目录:

超链接

https://docs.python.org/zh-cn/3/ # pyhton官方文档

https://www.python.org/ # python官网

语言类型

  1. 动态语言是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。比如Php、Asp、JavaScript、Python、Perl等等。
  2. 静态语言是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须声明数据类型。比如Java、C、C++、C#等。
  3. 弱类型语言是数据类型可以被忽略的语言。一个变量可以赋不同数据类型的值。一个变量的类型是由其上下文决定的,效率更高。
  4. 强类型语言是必须强制确定数据类型的语言,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这种数据类型,不允许隐式的类型转换。一个变量的类型是申明的时候就已经确定的,更安全。

区别:

静态语言由于强制声明数据类型,让开发工具(IDE)对代码有很强的判断能力,在实现复杂的业务逻辑和开发大型商业系统、以及那些声明周期很长的应用中,开发者可以依托强大的IDE来更高效、更安全地开发。

动态语言思维不受约束,可以任意发挥,把更多的精力放在产品本身上;集中思考业务逻辑实现,思考过程就是实现过程。

流程控制工具

编码风格

Python项目大多遵循POP8风格指南,核心要点如下:

  1. 命名类时各单词首字母大写,例如UpperCamelCase
  2. 命名函数或方法时各单词间用_分隔,例如lowercase_with_underscores
  3. 命名方法时第一个参数总是用self

数据结构

列表

insertremovesort 等方法只修改列表,不输出返回值——返回的默认值为 None

推导式

squares = []
for x in range(10):
    squares.append(x**2)

squares = [x**2 for x in range(10)]  # 等同于如上

常用循环技巧

items()方法同时取出字典的键和对应的值,keys()方法取键,values()方法取值

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

enumerate()函数可以同时取出列表中的位置索引和对应的值

for i, v in enumerate(['tic', 'tac', 'toe']):
    print(i, v)

zip()函数将多个列表中的元素一一匹配

questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
    print("What is your %s?  It is %s." % (q, a))
    print('What is your {0}?  It is {1}.'.format(q, a))  # 推荐使用该方法,具体分析见https://www.yisu.com/zixun/224708.html

模块

输入与输出

输出格式

字符串format()方法

用于代替%

读写文件

使用Json保存格式化数据

错误和异常

作用域和命名空间

namespace (命名空间)是一个从名字到对象的映射。命名空间在不同时刻被创建,拥有不同的生存期。

  1. 包含内置名称的内置命名空间是在 Python 解释器启动时创建的,永远不会被删除(内置名称实际上也存在于一个模块中;这个模块被称作 builtins
  2. 模块的全局命名空间在模块定义被读入时创建。通常,模块命名空间也会持续到解释器退出,它们拥有自己的全局命名空间;
  3. 函数的本地命名空间在调用该函数时创建,并在函数返回或抛出不在函数内部处理的错误时被删除。

作用域是一个命名空间可直接访问Python程序的文本区域。

在一个模块内定义的函数的全局作用域就是该模块的命名空间,无论该函数从什么地方或以什么别名被调用。

如果不存在生效的 globalnonlocal 语句 -- 则对名称的赋值总是会进入最内层作用域。 赋值不会复制数据 --- 它们只是将名称绑定到对象。 删除也是如此:语句 del x会从局部作用域所引用的命名空间中移除对 x 的绑定。 事实上,所有引入新名称的操作都是使用局部作用域:特别地,import 语句和函数定义会在局部作用域中绑定模块或函数名称。

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
# 输出结果
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

注意

函数与方法的区分

  • 直接独立定义的叫函数;
  • 在类里面定义的,又分两种情况:
    • 通过类名直接调用,还是函数;
    • 通过实例化以后调用的,就成了方法

函数是可以独立存在的个体,所有的参数都是显式传递的;而方法和实例化的对象严格绑定,同时在使用时会隐式传递一个实例化的对象(所以需要在方法的首位添加一个self参数)