> Python 判断文件或路径是否存在
http://www.jb51.net/article/66452.htm
> Anaconda 安装软件
conda install ***
> 以下内容转载自:廖雪峰老师博客
字符串里面的%是一个普通字符, 转义用%%来表示.
if判断条件还可以简写,比如写:
if x:
print 'True'
只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False。
判断键是否在字典中,in or get method.
return None可以简写为return
实际上,Python的函数返回多值其实就是返回一个tuple
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
在Python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
def func(a, b, c=0, *args, **kw):
print'a =', a,'b =', b,'c =', c,'args =', args,'kw =', kw
>>>func(1,2)
a =1 b =2 c =0 args = () kw = {}
>>>func(1,2, c=3)
a =1 b =2 c =3 args = () kw = {}
>>>func(1,2,3,'a','b')
a =1 b =2 c =3 args = ('a','b') kw = {}
>>>func(1,2,3,'a','b', x=99)
a =1 b =2 c =3 args = ('a','b') kw = {'x':99}
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
>>>from collections import Iterable
>>>isinstance('abc', Iterable)# str是否可迭代
True
>>>isinstance([1,2,3], Iterable)# list是否可迭代
True
>>>isinstance(123, Iterable)# 整数是否可迭代
False
List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
>>>[x * x for x in range(1,11) if x %2==0]
[4,16,36,64,100]
>>>[m + n for m in 'ABC' for n in 'XYZ']
['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ']
generator
>函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
1> 函数本身也可以赋值给变量,即:变量可以指向函数。
2> 函数名其实就是指向函数的变量!
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数.
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
>map函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
>reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
str转换为 int.
def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]
def str2int(s):
return reduce(lambda x,y: x*10+y, map(char2num, s))
练习
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']。
map(lambda w:w.title(),L)
Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积。
reduce(lambda x,y:x*y,L)
>和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
>sorted()函数也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。
>关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
>在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
本质上,decorator就是一个返回函数的高阶函数。
>简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
> 模块
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中
Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。
> 类
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print'%s: %s'% (self.__name, self.__score)
def get_name(self):
return self.__name
def get_score(self):
return self.__score
def set_score(self, score):
if 0<= score <=100:
self.__score = score
else:
raise ValueError('bad score')
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量.
>>>bart._Student__name
'Bart Simpson'
判断基本数据类型可以直接写int,str等,但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
>>>import types
>>>def fn():
... pass
>>>type(fn)==types.FunctionType
True
>>>type(abs)==types.BuiltinFunctionType
True
>>>type(lambdax:x)==types.LambdaType
True
>>>type((x for x in range(10)))==types.GeneratorType
True
......