Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python 快速学习 #100

Open
chunpu opened this issue Nov 27, 2018 · 2 comments
Open

Python 快速学习 #100

chunpu opened this issue Nov 27, 2018 · 2 comments

Comments

@chunpu
Copy link
Owner

chunpu commented Nov 27, 2018

学习一个语言, 我个人一般会先了解这些东西, 优先级依次排序

  • 如何打印一个变量
  • 有哪些数据类型, 有哪些内置方法, 如何查看/判断数据类型
  • 变量作用域
  • 是否支持闭包
  • 模块的引入和导出
  • 是否支持类
  • 异常如何操作
  • 如何注释
  • 标准库提供了哪些功能
  • 如何操作 json
  • 如何安装依赖, 有哪些必备的库

如果已经会多种语言了, 就会知道, 对于初学者来说, 语言特性才是最重要的

初学者先要学会使用这门语言, 更在意语言的数据结构, 有哪些内置的方法

调优, 性能, 垃圾回收, 内部原理等还不在学习范围之内

笔者最熟的语言是 Javascript, 因此可能会拿 Javascript 中的一些语法作为类比

如何打印

编码问题是 python2 最傻的问题

对于 python2.7, #coding=utf-8 这句话绝对不能少

#coding=utf-8

print('中文') # 才可以正常打印出 "中文" 两个字

数据类型

type(None) # None

type(True) # bool, types.BooleanType
type(False) # bool

type(0) # int
type(1.2) # float

type('中文') # str
type(u'中文') # unicode

type([]) # list
type((1, 2)) # tuple 元组, 不可改变的数组, 性能比较高, 适合并发场景, 很容易和括号表达式产生歧义
type({}) # dict
type(set([1, 2, 3])) # set, 只能存不同值的 vector, 没有索引, 顺序不保证

def func():end
type(func) # function

type(id) # builtin_function_or_method, id是一个函数

list 相当于 vector, vector 是更灵活的容器, 存放的是数值的指针, 因此更为灵活, 比如 python 中的 list, javascript 中的 array

传统意义上数组一般指存放类型相同的数据, 比如 javascript 中的 TypedArray, python 中的 array(import array), 一般在高性能计算中使用

数据类型长度

len(type('中文')) # 6, 系统编码类型, 一般是 utf-8, '\xe4\xb8\xad\xe6\x96\x87'
len(type(u'中文')) # 2, unicode 类型, u'\u4e2d\u6587'

要注意, python3 和 javascript 中都是 unicode 类型, 内部是 utf-16

也就是说字符串 中文 的长度默认是 2 才对

判断数据类型

import types

x = 1

type(x) == types.IntType # True, 通过类型的值判断
type(x) == type(0) # True, 通过类型的值判断, 懒得 import types 可以这么写
isinstance(x, int) # True, 通过实例判断

dict 数据类型

比 Javascript 稍显繁琐

d = {"a":1, "b":2}

"b" in d

d.get("c") # => None

d["c"] = 3

del d["b"]

d.keys()

d.values()

d.items()

切片 slice

切片可以认为是一种索引的扩展, 也就是说切片支持各种索引数据结构

# 支持各种可索引的数据结构
x = [0, 1, 2, 3, 4]
print(x[1:3]) # [1, 2]
x = '01234'
print(x[1:3]) # '12'
x = (0, 1, 2, 3, 4)
print(x[1:3]) # (1, 2)

# 支持负数索引
x = [0, 1, 2, 3, 4]
print(x[1:-1]) # [1, 2, 3]

# 支持步进(step)
x = '01234'
print(x[0:4:2]) # [0, 2, 4]

# 默认值支持省略, 可轻松实现复制
x = [0, 1, 2, 3, 4]
print(x[:]) # [0, 1, 2, 3, 4]
print(x[0:5:1]) # [0, 1, 2, 3, 4], 默认值

# 支持负数步进巧妙实现倒序
x = [0, 1, 2, 3]
print(x[::-1]) # [3, 2, 1, 0]

表达式

def func(a, b):
    return a + b

func(1, 2) # 3

x = 10

if x > 5:
    print('big')
elif x < 5:
    print('small')
else:
    print('good')

变量作用域

只有函数作用域, 没有块作用域, 没有声明提升

def parent():
    parentLocals = locals()
    def child():
        x = 0
        childLocals = locals()
        print(parentLocals == childLocals) # False
        if x < 5:
            y = 1
            print(childLocals == locals()) # True
        else:
            z = 2
            print(childLocals == locals())
        print(childLocals) # {'y': 1, 'x': 0, 'parentLocals': {}, 'childLocals': {...}}
    child()

parent()

推荐使用更强大的 vars, vars 无参数的时候和 locals 一样, 但还可以把 module 作为参数

遍历一切的 for

for item in [1, 2, 3]:
    print(item)

需要有 key 和 value

使用 enumerate

for k, v in enumerate([3, 4, 5]):
    print(k, v)
for k, v in enumerate('345'):
    print(k, v)
for k, v in enumerate((3, 4, 5)):
    print(k, v)
for k, v in enumerate({'a': 1, 'b': 2}):
    print(k, v)
for k, v in enumerate(set('345')):
    print(k, v)

运算符

大部分和 c, javascript 相同

没有 ++--

哪些值是 false

for item in [0, False, None, '', '0', [], {}, (), set()]:
    if item:
        print(item, True)
    else:
        print(item, False)

其中只有 '0' 是 True, 其他都是 False, 专门测试字符串0是因为 PHP

可以归纳出对于可迭代对象, 如果是空则为 False, 非空就是 True

而 javascript 中对象只要是非空对象都是 True

没有隐式类型转换

print(1 == '1') # False

没有隐式类型转换

展开运算符

*args 相当于 ...args

变量查找顺序

locals -> enclosing function -> global -> __builtins__

enclosing function 可以理解为 closure 闭包

内置函数与变量

import __builtin__

print(vars(__builtin__))

能看到全部的内置函数和变量, 美滋滋, 比如 eval, id, len 函数, 以及各种 __xx__ 的变量等

闭包

闭包: 当函数离开创建环境后,依然持有其上下⽂文状态

def func():
    x = 1
    z = [1, 2]
    print(hex(id(x))) # 0x7fd20a701cb8
    def a():
        y = 2
        print(x)

    return a

a = func()

a()

print(a.func_closure)
# (<cell at 0x10bef8248: int object at 0x7fd20a701cb8>,)
# int object 就是 x 变量
# 没有 z 因为 z 没有被用到

Python 处理 JSON

import json

json.dumps({}) # => '{}'
json.loads('{}') # => {}

错误处理

try:
    if n % 2:
        raise Exception("Error Message!")
except Exception as ex:
    print("Exception:", ex.message)
else:
    print("Else...")
finally:
    print("Finally...")

迭代器协议

只需要 __iter__()next() 两个方法就可以自助一个可迭代类, 以后会单独写一篇文章

有一个标准库 itertools, 看着就像一个简版 lodash

生成器协议

以后会单独写一篇文章

描述符协议

get

set

delete

以后会单独写一篇文章

上下文管理协议

英文名 Context Management Protocol

__enter__

__exit__

以后会单独写一篇文章

python2 和 python3

写出兼容 python2 和 python3 兼容的代码是很容易的, 因为 python3 很多是比 python2 更严格了

  • python3 print 是函数
  • 3 / 2 = 1.5 python3 终于正常了, 不再是整除了
  • range 返回迭代器

包依赖与包管理

pip 相当于 npm

生成包依赖

pip freeze > requirements.txt

安装包依赖

pip install -r requirements.txt

要注意, pip3 是指 python3 对应的 pip, 而不是 pip version 3

SQLALCHEMY

Python 中的 ORM

编码规范

几乎都用 PEP8 规范

比如 google 的 https://github.com/google/yapf (star 8000+) 默认也是PEP8

pycharm 用的就是 PEP8

PEP 是 Python Enhancement Proposals 的缩写, Python 增强建议书

几个关键

  • 4空格缩进
  • 句子双引号, 单词单引号
  • 模块和包名用全小写且没有下划线
  • 类名用大驼峰
  • 变量名和函数名用小写+下划线
  • 对于太长换行则使用8空格缩进
  • 缺省参数值没有空格
# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()
def complex(real, imag=0.0):
    return magic(r=real, i=ima

网上有很多编码规范翻译的博客

https://www.cnblogs.com/ajianbeyourself/p/4377933.html

@jimngaipaang
Copy link

👍

@jimngaipaang
Copy link

学习一个语言, 我个人一般会先了解这些东西, 优先级依次排序

  • 如何打印一个变量

  • 有哪些数据类型, 有哪些内置方法, 如何查看/判断数据类型

  • 变量作用域

  • 是否支持闭包

  • 模块的引入和导出

  • 是否支持类

  • 异常如何操作

  • 如何注释

  • 标准库提供了哪些功能

  • 如何操作 json

  • 如何安装依赖, 有哪些必备的库

如果已经会多种语言了, 就会知道, 对于初学者来说, 语言特性才是最重要的

初学者先要学会使用这门语言, 更在意语言的数据结构, 有哪些内置的方法

调优, 性能, 垃圾回收, 内部原理等还不在学习范围之内

笔者最熟的语言是 Javascript, 因此可能会拿 Javascript 中的一些语法作为类比

如何打印

编码问题是 python2 最傻的问题

对于 python2.7, #coding=utf-8 这句话绝对不能少

#coding=utf-8



print('中文') # 才可以正常打印出 "中文" 两个字

数据类型

type(None) # None



type(True) # bool, types.BooleanType

type(False) # bool



type(0) # int

type(1.2) # float



type('中文') # str

type(u'中文') # unicode



type([]) # list

type((1, 2)) # tuple 元组, 不可改变的数组, 性能比较高, 适合并发场景, 很容易和括号表达式产生歧义

type({}) # dict

type(set([1, 2, 3])) # set, 只能存不同值的 vector, 没有索引, 顺序不保证



def func():end

type(func) # function



type(id) # builtin_function_or_method, id是一个函数

list 相当于 vector, vector 是更灵活的容器, 存放的是数值的指针, 因此更为灵活, 比如 python 中的 list, javascript 中的 array

传统意义上数组一般指存放类型相同的数据, 比如 javascript 中的 TypedArray, python 中的 array(import array), 一般在高性能计算中使用

数据类型长度

len(type('中文')) # 6, 系统编码类型, 一般是 utf-8, '\xe4\xb8\xad\xe6\x96\x87'

len(type(u'中文')) # 2, unicode 类型, u'\u4e2d\u6587'

要注意, python3 和 javascript 中都是 unicode 类型, 内部是 utf-16

也就是说字符串 中文 的长度默认是 2 才对

判断数据类型

import types



x = 1



type(x) == types.IntType # True, 通过类型的值判断

type(x) == type(0) # True, 通过类型的值判断, 懒得 import types 可以这么写

isinstance(x, int) # True, 通过实例判断

dict 数据类型

比 Javascript 稍显繁琐

d = {"a":1, "b":2}



"b" in d



d.get("c") # => None



d["c"] = 3



del d["b"]



d.keys()



d.values()



d.items()

切片 slice

切片可以认为是一种索引的扩展, 也就是说切片支持各种索引数据结构

# 支持各种可索引的数据结构

x = [0, 1, 2, 3, 4]

print(x[1:3]) # [1, 2]

x = '01234'

print(x[1:3]) # '12'

x = (0, 1, 2, 3, 4)

print(x[1:3]) # (1, 2)



# 支持负数索引

x = [0, 1, 2, 3, 4]

print(x[1:-1]) # [1, 2, 3]



# 支持步进(step)

x = '01234'

print(x[0:4:2]) # [0, 2, 4]



# 默认值支持省略, 可轻松实现复制

x = [0, 1, 2, 3, 4]

print(x[:]) # [0, 1, 2, 3, 4]

print(x[0:5:1]) # [0, 1, 2, 3, 4], 默认值



# 支持负数步进巧妙实现倒序

x = [0, 1, 2, 3]

print(x[::-1]) # [3, 2, 1, 0]

表达式

def func(a, b):

    return a + b



func(1, 2) # 3



x = 10



if x > 5:

    print('big')

elif x < 5:

    print('small')

else:

    print('good')

变量作用域

只有函数作用域, 没有块作用域, 没有声明提升

def parent():

    parentLocals = locals()

    def child():

        x = 0

        childLocals = locals()

        print(parentLocals == childLocals) # False

        if x < 5:

            y = 1

            print(childLocals == locals()) # True

        else:

            z = 2

            print(childLocals == locals())

        print(childLocals) # {'y': 1, 'x': 0, 'parentLocals': {}, 'childLocals': {...}}

    child()



parent()

推荐使用更强大的 vars, vars 无参数的时候和 locals 一样, 但还可以把 module 作为参数

遍历一切的 for

for item in [1, 2, 3]:

    print(item)

需要有 key 和 value

使用 enumerate

for k, v in enumerate([3, 4, 5]):

    print(k, v)

for k, v in enumerate('345'):

    print(k, v)

for k, v in enumerate((3, 4, 5)):

    print(k, v)

for k, v in enumerate({'a': 1, 'b': 2}):

    print(k, v)

for k, v in enumerate(set('345')):

    print(k, v)

运算符

大部分和 c, javascript 相同

没有 ++--

哪些值是 false

for item in [0, False, None, '', '0', [], {}, (), set()]:

    if item:

        print(item, True)

    else:

        print(item, False)

其中只有 '0' 是 True, 其他都是 False, 专门测试字符串0是因为 PHP

可以归纳出对于可迭代对象, 如果是空则为 False, 非空就是 True

而 javascript 中对象只要是非空对象都是 True

没有隐式类型转换

print(1 == '1') # False

没有隐式类型转换

展开运算符

*args 相当于 ...args

变量查找顺序

locals -> enclosing function -> global -> __builtins__

enclosing function 可以理解为 closure 闭包

内置函数与变量

import __builtin__



print(vars(__builtin__))

能看到全部的内置函数和变量, 美滋滋, 比如 eval, id, len 函数, 以及各种 __xx__ 的变量等

闭包

闭包: 当函数离开创建环境后,依然持有其上下⽂文状态

def func():

    x = 1

    z = [1, 2]

    print(hex(id(x))) # 0x7fd20a701cb8

    def a():

        y = 2

        print(x)



    return a



a = func()



a()



print(a.func_closure)

# (<cell at 0x10bef8248: int object at 0x7fd20a701cb8>,)

# int object 就是 x 变量

# 没有 z 因为 z 没有被用到

Python 处理 JSON

import json



json.dumps({}) # => '{}'

json.loads('{}') # => {}

错误处理

try:

    if n % 2:

        raise Exception("Error Message!")

except Exception as ex:

    print("Exception:", ex.message)

else:

    print("Else...")

finally:

    print("Finally...")

迭代器协议

只需要 __iter__()next() 两个方法就可以自助一个可迭代类, 以后会单独写一篇文章

有一个标准库 itertools, 看着就像一个简版 lodash

生成器协议

以后会单独写一篇文章

描述符协议

get

set

delete

以后会单独写一篇文章

上下文管理协议

英文名 Context Management Protocol

__enter__

__exit__

以后会单独写一篇文章

python2 和 python3

写出兼容 python2 和 python3 兼容的代码是很容易的, 因为 python3 很多是比 python2 更严格了

  • python3 print 是函数

  • 3 / 2 = 1.5 python3 终于正常了, 不再是整除了

  • range 返回迭代器

包依赖与包管理

pip 相当于 npm

生成包依赖

pip freeze > requirements.txt

安装包依赖

pip install -r requirements.txt

要注意, pip3 是指 python3 对应的 pip, 而不是 pip version 3

SQLALCHEMY

Python 中的 ORM

编码规范

几乎都用 PEP8 规范

比如 google 的 https://github.com/google/yapf (star 8000+) 默认也是PEP8

pycharm 用的就是 PEP8

PEP 是 Python Enhancement Proposals 的缩写, Python 增强建议书

几个关键

  • 4空格缩进

  • 句子双引号, 单词单引号

  • 模块和包名用全小写且没有下划线

  • 类名用大驼峰

  • 变量名和函数名用小写+下划线

  • 对于太长换行则使用8空格缩进

  • 缺省参数值没有空格

# Add some extra indentation on the conditional continuation line.

if (this_is_one_thing

        and that_is_another_thing):

    do_something()
def complex(real, imag=0.0):

    return magic(r=real, i=ima

网上有很多编码规范翻译的博客

https://www.cnblogs.com/ajianbeyourself/p/4377933.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants