1,函数也可以被当做其他对象一样处理。对象模型的一致性,Python解释器中出现的任何数值、字符串、数据结构、函数、类、模块等都待在自己的“盒子”里,这个盒子即是对象。
2,引用传递。Python对变量赋值时,实际上是在创建等号右边的一个引用。(copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。copy.deepcopy 深拷贝 拷贝对象及其子对象)
3,强类型语言。所有对象都有一个特定的类型,隐式转换只是在很明显的情况下才发生(isinstance)。
4,判断列表中是否有某个值的操作要比字典dict和集合set慢得多,因为Python会对列表中每个值进行扫描,而其他两个(基于哈希表)则可以瞬间完成判断。
5,列表的合并是中相当费资源的操作,需要创建两个新列表并将所有元素放到其中,用extend将元素附加到现有列表会好很多。
6,zip用于将多个序列中的元素配对,形成一个新的元祖序列。可以接受多个任意长度的序列,但最终结果由最短的序列决定(解压:v1,v2 = zip(*zipped_seq))。
7,推导式。列表:[expr for value in collection if condition];字典:{key-expr:value-expr for value in collection if condition};集合:{expr for value in collection if condition}(字典和集合推导式是Python2.7和Python3.1+出现);生成器:(expr for value in collection if condition)可嵌套:[expr for collection2 in collection for value in collection2 if condition];
8,闭包是由其他函数动态生成的函数(子函数可以使用父函数中的局部变量,这种行为就叫做闭包!)。
In [10]:l = [5,4,3,4,34,5,34,3,443,43,4,3]
In [11]:def check():
...: return True
...: else:
...: have_seen[x]=True
...: return False
...: return watch
...:
In [12]:map(check(),l)
Out[12]: [False, False, False, True, False, True, True, True, False, False, True, True]
9,生成器是以延迟的方式返回一个值序列,即每返回一个值后暂停,直到下一个值被请求时再继续,要创建一个生成器只需要将return改成yield即可。itertools提供了一组用于许多常见数据算法的生成器,如groupby(Python2.x中产生列表的内置函数(map,filter,zip等),在Python3中都被变成了生成器版)
In [41]:def make_change(amount,coins=[1,5,10,25],hand=None):
...: hand = [] if hand is None else hand
...: if amount == 0:
...: yield hand
...: for coin in coins:
...: if coin>amount or (len(hand)>0 and hand[-1]<coin):
...: continue
...: for result in make_change(amount-coin,coins,hand=hand+[coin]):
...: yield result
...:
In [42]:for i in make_change(30,coins=[5,10]):
...: print i
...:
[5, 5, 5, 5, 5, 5]
[10, 5, 5, 5, 5]
[10, 10, 5, 5]
[10, 10, 10]
2,引用传递。Python对变量赋值时,实际上是在创建等号右边的一个引用。(copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。copy.deepcopy 深拷贝 拷贝对象及其子对象)
3,强类型语言。所有对象都有一个特定的类型,隐式转换只是在很明显的情况下才发生(isinstance)。
4,判断列表中是否有某个值的操作要比字典dict和集合set慢得多,因为Python会对列表中每个值进行扫描,而其他两个(基于哈希表)则可以瞬间完成判断。
5,列表的合并是中相当费资源的操作,需要创建两个新列表并将所有元素放到其中,用extend将元素附加到现有列表会好很多。
6,zip用于将多个序列中的元素配对,形成一个新的元祖序列。可以接受多个任意长度的序列,但最终结果由最短的序列决定(解压:v1,v2 = zip(*zipped_seq))。
7,推导式。列表:[expr for value in collection if condition];字典:{key-expr:value-expr for value in collection if condition};集合:{expr for value in collection if condition}(字典和集合推导式是Python2.7和Python3.1+出现);生成器:(expr for value in collection if condition)可嵌套:[expr for collection2 in collection for value in collection2 if condition];
8,闭包是由其他函数动态生成的函数(子函数可以使用父函数中的局部变量,这种行为就叫做闭包!)。
In [10]:l = [5,4,3,4,34,5,34,3,443,43,4,3]
In [11]:def check():
...: have_seen = {}
...: x = 1
...: # x+=1 会报错
...: # y=x+1 不会报错 可以使用但不可以赋值
...: return True
...: else:
...: have_seen[x]=True
...: return False
...: return watch
...:
In [12]:map(check(),l)
Out[12]: [False, False, False, True, False, True, True, True, False, False, True, True]
9,生成器是以延迟的方式返回一个值序列,即每返回一个值后暂停,直到下一个值被请求时再继续,要创建一个生成器只需要将return改成yield即可。itertools提供了一组用于许多常见数据算法的生成器,如groupby(Python2.x中产生列表的内置函数(map,filter,zip等),在Python3中都被变成了生成器版)
In [41]:def make_change(amount,coins=[1,5,10,25],hand=None):
...: hand = [] if hand is None else hand
...: if amount == 0:
...: yield hand
...: for coin in coins:
...: if coin>amount or (len(hand)>0 and hand[-1]<coin):
...: continue
...: for result in make_change(amount-coin,coins,hand=hand+[coin]):
...: yield result
...:
In [42]:for i in make_change(30,coins=[5,10]):
...: print i
...:
[5, 5, 5, 5, 5, 5]
[10, 5, 5, 5, 5]
[10, 10, 5, 5]
[10, 10, 10]