超链接
https://docs.python.org/zh-cn/3/ # pyhton官方文档
https://www.python.org/ # python官网
语言类型
- 动态语言是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。比如Php、Asp、JavaScript、Python、Perl等等。
- 静态语言是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须声明数据类型。比如Java、C、C++、C#等。
- 弱类型语言是数据类型可以被忽略的语言。一个变量可以赋不同数据类型的值。一个变量的类型是由其上下文决定的,效率更高。
- 强类型语言是必须强制确定数据类型的语言,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这种数据类型,不允许隐式的类型转换。一个变量的类型是申明的时候就已经确定的,更安全。
区别:
静态语言由于强制声明数据类型,让开发工具(IDE)对代码有很强的判断能力,在实现复杂的业务逻辑和开发大型商业系统、以及那些声明周期很长的应用中,开发者可以依托强大的IDE来更高效、更安全地开发。
动态语言思维不受约束,可以任意发挥,把更多的精力放在产品本身上;集中思考业务逻辑实现,思考过程就是实现过程。
流程控制工具
编码风格
Python项目大多遵循POP8风格指南,核心要点如下:
- 命名类时各单词首字母大写,例如
UpperCamelCase
; - 命名函数或方法时各单词间用_分隔,例如
lowercase_with_underscores
; - 命名方法时第一个参数总是用
self
;
数据结构
列表
insert
、remove
、sort
等方法只修改列表,不输出返回值——返回的默认值为 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 (命名空间)是一个从名字到对象的映射。命名空间在不同时刻被创建,拥有不同的生存期。
- 包含内置名称的内置命名空间是在 Python 解释器启动时创建的,永远不会被删除(内置名称实际上也存在于一个模块中;这个模块被称作 builtins)
- 模块的全局命名空间在模块定义被读入时创建。通常,模块命名空间也会持续到解释器退出,它们拥有自己的全局命名空间;
- 函数的本地命名空间在调用该函数时创建,并在函数返回或抛出不在函数内部处理的错误时被删除。
作用域是一个命名空间可直接访问Python程序的文本区域。
在一个模块内定义的函数的全局作用域就是该模块的命名空间,无论该函数从什么地方或以什么别名被调用。
如果不存在生效的 global 或 nonlocal 语句 -- 则对名称的赋值总是会进入最内层作用域。 赋值不会复制数据 --- 它们只是将名称绑定到对象。 删除也是如此:语句 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参数)