Python

2015-12-05  本文已影响739人  安于然

> 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

......

上一篇下一篇

猜你喜欢

热点阅读