当前位置:首页 > Python教程 > python技巧

Python学习笔记2

条件判断

Format

            
                
                    if 
                
            
            
                <
            
            
                条件判断
            
            
                1
            
            
                >
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                <
            
            
                执行
            
            
                1
            
            
                >
            
        
            
                
                    elif 
                
            
            
                <
            
            
                条件判断
            
            
                2
            
            
                >
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                <
            
            
                执行
            
            
                2
            
            
                >
            
        
            
                
                    elif 
                
            
            
                <
            
            
                条件判断
            
            
                3
            
            
                >
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                <
            
            
                执行
            
            
                3
            
            
                >
            
        
            
                
                    else:
                
            
        
            
                
                        
                
            
            
                <
            
            
                执行
            
            
                4
            
            
                >
            
        

E.g

            
                
                    age = 
                
            
            
                20
            
        
            
                if
            
            
                
                     age >= 
                
            
            
                6
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                print
            
            
                ‘teenager‘
            
        
            
                elif
            
            
                
                     age >= 
                
            
            
                18
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                print
            
            
                ‘adult‘
            
        
            
                else
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                print
            
            
                ‘kid‘
            
        
迭代

默认情况下, dict 迭代的是 key 。如果要迭代 value ,可以用 for value in d.itervalues() ,如果要同时迭代 key value ,可以用 for k, v ind.iteritems()

            
                d={‘k1‘:1,‘k2‘:2,‘k3‘:3}
            
        
            
                 
            
        
            
                for j in d.itervalues():
            
        
            
                
                    
                                
                    
                    print j
                
            
        
             
        
            
                for i,j in d.iteritems():
            
        
            
                
                    
                                
                    
                    print i,j
                
            
        

循环

For

Format

For 循环分为 2 种格式

For   item in   < 数组 >

            
                for
            
            item
            
                in
            
            
                
                     [
                
            
            
                1
            
            
                
                    , 
                
            
            
                2
            
            
                
                    , 
                
            
            
                3
            
            
                
                    , 
                
            
            
                4
            
            
                
                    , 
                
            
            
                5
            
            
                
                    , 
                
            
            
                6
            
            
                
                    , 
                
            
            
                7
            
            
                
                    , 
                
            
            
                8
            
            
                
                    , 
                
            
            
                9
            
            
                
                    , 
                
            
            
                10
            
            
                
                    ]:
                
            
        
            
                
                        
                
                sum = sum + 
            
            item
        

 

foritem range < 范围 >

            
                for
            
            item
            
                in
            
            
                
                    (0,10)
                
                
                    :
                
            
        
            
                
                        
                
                sum = sum + 
            
            item
        

 

设置 for 循环步长为 2

            
                for
            
            item
            
                in
            
            
                
                    (0,10
                
            
            
                
                    
                    2
                
                )
                
                    :
                
            
        
            
                
                        
                
                sum = sum + 
            
            item
        

 

while

Format

While < 判断条件 >

            
                
                    sum = 
                
            
            
                0
            
        
            
                
                    n = 
                
            
            
                99
            
        
            
                while
            
            
                
                     n > 
                
            
            
                0
            
            
                
                    :
                
            
        
            
                
                        
                
                sum = sum + n
            
        
            
                
                        
                
                n = n - 
            
            
                2
            
        
            
                print
            
            
                
                     sum
                
            
        

数据类型转

Python 内置的常用函数还包括数据类型转换函数,比如int()函数可以把其他数据类型转换为整数:

            
                >>> 
            
            
                
                    int(
                
            
            
                ‘123‘
            
            
                
                    )
                
            
        
            
                123
            
        
            
                >>> 
            
            
                
                    int(
                
            
            
                12.34
            
            
                
                    )
                
            
        
            
                12
            
        
            
                >>> 
            
            
                
                    float(
                
            
            
                ‘12.34‘
            
            
                
                    )
                
            
        
            
                12.34
            
        
            
                >>> 
            
            
                
                    str(
                
            
            
                1.23
            
            
                
                    )
                
            
        
            
                ‘1.23‘
            
        
            
                >>> 
            
            
                
                    unicode(
                
            
            
                100
            
            
                
                    )
                
            
        
            
                u‘100‘
            
        
            
                >>> 
            
            
                
                    bool(
                
            
            
                1
            
            
                
                    )
                
            
        
            
                True
            
        
            
                >>> 
            
            
                
                    bool(
                
            
            
                ‘‘
            
            
                
                    )
                
            
        
            
                False
            
        

函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:

            
                >>> 
            
            
                
                    a = abs 
                
            
            
                
                    # 
                
                
                    变量
                
                
                    a
                
                
                    指向
                
                
                    abs
                
                
                    函数
                
            
        
            
                >>> 
            
            
                
                    a(-
                
            
            
                1
            
            
                
                    ) 
                
            
            
                
                    # 
                
                
                    所以也可以通过
                
                
                    a
                
                
                    调用
                
                
                    abs
                
                
                    函数
                
            
        
            
                1
            
        

 

系统函数

https://docs.python.org/3/library/functions.html?highlight=abs#abs

函数

 

Format

def<function Name> (parameter):

 

            
            
            defmy_abs(x):
        
            
                
                        
                
            
            
                if
            
            
                
                     x >= 
                
            
            
                0
            
            
                
                    :
                
            
        
            
                
                            
                
            
            
                return
            
            
                
                     x
                
            
        
            
                
                        
                
            
            
                else
            
            
                
                    :
                
            
        
            
                
                            
                
            
            
                return
            
            
                
                     -x
                
            
        

 

多个参数与多个返回值

            
                def 
            
            
                my_abs
            
            
                (x,y):
            
        
            
                    
            
            if x >= 0 and y>6:
        
            
                
                    
                                
                    
                        
                
                return -x,y
            
        
            
                    
            
            else:
        
            
                        
            
            return +x,y
        
            
                
                    
                                
                    
                      
                
            
        
            
                
                    
                                       
                    
                
            
        
            
                x,y=my_abs(5,5)
            
            //
            
                使用
            
            2
            
                个变量进行接收
            
        
            
                 
            
        
            
                print x,y
                      
            
        
             
        

空函

如果想定义一个什么事也不做的空函数,可以用pass语句:

            
                def
            
            
                nop
            
            
                ()
            
            
                :
            
        
            
                
                        
                
            
            
                pass
            
        

pass 语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

pass 还可以用在其他语句里,比如:

            
                if
            
            
                
                     age >= 
                
            
            
                18
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                pass
            
        

缺少了pass,代码运行就会有语法错误。

指向函 数的变量

函数本身也可以赋值给变量,即:变量可以指向函数。

            
                >>> 
            
            
                
                    f = abs
                
            
        
            
                >>> 
            
            
                
                    f(-
                
            
            
                10
            
            
                
                    )
                
            
        
            
                10
            
        

成功!说明变量 f 现在已经指向了 abs 函数本身。

 

作为参数的函

既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数

            
                def
            
            
                add
            
            
                (x, y, f)
            
            
                :
            
        
            
                
                        
                
            
            
                return
            
            
                
                     f(x) + f(y)
                
            
        

当我们调用 add(-5, 6, abs) 时,参数 x y f 分别接收 -5 6 abs ,根据函数定义,我们可以推导计算过程为:

            
                
                    x ==> -
                
            
            
                5
            
        
            
                
                    y ==> 
                
            
            
                6
            
        
            
                
                    f ==> abs
                
            
        
            
                
                    f(x) + f(y) ==> abs(-
                
            
            
                5
            
            
                
                    ) + abs(
                
            
            
                6
            
            
                
                    ) ==> 
                
            
            
                11
            
        

 

作为返回 值的 函数

我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的:

            
                def
            
            
                calc_sum
            
            
                (*args)
            
            
                :
            
        
            
                
                        
                
                ax = 
            
            
                0
            
        
            
                
                        
                
            
            
                for
            
            
                
                     n 
                
            
            
                in
            
            
                
                     args:
                
            
        
            
                
                            
                
                ax = ax + n
            
        
            
                
                        
                
            
            
                return
            
            
                
                     ax
                
            
        

但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数!

            
                def
            
            
                lazy_sum
            
            
                (*args)
            
            
                :
            
        
            
                
                        
                
            
            
                def
            
            
                sum
            
            
                ()
            
            
                :
            
        
            
                
                            
                
                ax = 
            
            
                0
            
        
            
                
                            
                
            
            
                for
            
            
                
                     n 
                
            
            
                in
            
            
                
                     args:
                
            
        
            
                
                                
                
                ax = ax + n
            
        
            
                
                            
                
            
            
                return
            
            
                
                     ax
                
            
        
            
                
                        
                
            
            
                return
            
            
                
                    sum
                
            
        

当我们调用 lazy_sum() 时,返回的并不是求和结果,而是求和函数:

            
                
                    >>> f = lazy_sum(
                
            
            
                1
            
            
                
                    , 
                
            
            
                3
            
            
                
                    , 
                
            
            
                5
            
            
                
                    , 
                
            
            
                7
            
            
                
                    , 
                
            
            
                9
            
            
                
                    )
                
            
        
            
                
                    >>> f
                
            
        
            
                
                    <
                
            
            
                function
            
            
                sum
            
            
                at
            
            
                 0
            
            
                x10452f668
            
            
                >
            
        

调用函数 f 时,才真正计算求和的结果:

            
                >>> 
            
            
                
                    f()
                
            
        
            
                25
            
        

总结,当调用 f = lazy_sum( 1 , 3 , 5 , 7 , 9 ) 函数的返回值是 sum, 因此是 sum 的地址,此时 sum 函数未开始执行,当调用 f() 时, sum 函数才会开始执行

 

D ecorator

假如函数调用前后自动打印日志,但又不希望修改 now() 函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”Decorator)。

 

函数对象有一个 __name__ 属性,可以拿到函数的名字:

            
                >>> 
            
            
                
                    now.__name__
                
            
        
            
                ‘now‘
            
        
            
                >>> 
            
            
                
                    f.__name__
                
            
        
            
                ‘now‘
            
        

假设我们要增强 now() 函数的功能,比如,在本质上,decorator就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:

            
                def
            
            
                log
            
            
                (func)
            
            
                :
            
        
            
                
                        
                
            
            
                def
            
            
                wrapper
            
            
                (*args, **kw)
            
            
                :
            
        
            
                
                            
                
            
            
                print
            
            
                ‘call %s():‘
            
            
                
                     % func.__name__
                
            
        
            
                
                            
                
            
            
                return
            
            
                
                     func(*args, **kw)
                
            
        
            
                
                        
                
            
            
                return
            
            
                
                     wrapper
                
            
        

观察上面的 log ,因为它是一个 decorator ,所以接受一个函数作为参数,并返回一个函数。我们要借助Python@语法,把decorator置于函数的定义处:

            
                @log
            
        
            
                def
            
            
                now
            
            
                ()
            
            
                :
            
        
            
                
                        
                
            
            
                print
            
            
                ‘2013-12-25‘
            
        

调用 now() 函数,不仅会运行 now() 函数本身,还会在运行 now() 函数前打印一行日志:

            
                
                    >>> now()
                
            
        
            
                call
            
            
                 now():
            
        
            2013
            
                -
            
            12
            
                -
            
            25
        

@log 放到 now() 函数的定义处,相当于执行了语句:

            
                now = 
            
            log(now)
        

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本:

            
                def
            
            
                log
            
            
                (text)
            
            
                :
            
        
            
                
                        
                
            
            
                def
            
            
                decorator
            
            
                (func)
            
            
                :
            
        
            
                
                            
                
            
            
                def
            
            
                wrapper
            
            
                (*args, **kw)
            
            
                :
            
        
            
                
                                
                
            
            
                print
            
            
                ‘%s %s():‘
            
            
                
                     % (text, func.__name__)
                
            
        
            
                
                                
                
            
            
                return
            
            
                
                     func(*args, **kw)
                
            
        
            
                
                            
                
            
            
                return
            
            
                
                     wrapper
                
            
        
            
                
                        
                
            
            
                return
            
            
                
                     decorator
                
            
        

这个3层嵌套的decorator用法如下:

            
                @log(‘execute‘)
            
        
            
                def
            
            
                now
            
            
                ()
            
            
                :
            
        
            
                
                        
                
            
            
                print
            
            
                ‘2013-12-25‘
            
        

执行结果如下:

            
                >>> 
            
            
                
                    now()
                
            
        
            
                
                    execute now():
                
            
        
            2013
            
                
                    -
                
            
            12
            
                
                    -
                
            
            25
        

和两层嵌套的decorator相比,3层嵌套的效果是这样的:

            
                >>> 
            
            
                VariantN
                
                    ow = log(
                
            
            
                ‘execute‘
            
            
                
                    )(now)
                
            
        

 

总结:wrapper()函数的参数定义是(*args, **kw) 是函数对应的2个参数,args是参数个数,kw是指向参数数组首元素的指针。wrapper()函数参数不能改变,decorator(func)中的参数是func=now,

因此当调用@log(‘execute‘)是可认为变量VariantNow指向了一个函数(decorator)

VariantNow =log(‘execute‘)(now)

 

当执行VariantNow()时候可认为执行了一下内容

Decorator(now)à wrapper(now函数参数个数,now函数参数内容)->print

 

 

文件读写

读文

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:

            
                >>> 
            
            
                
                    f = open(
                
            
            
                ‘/Users/michael/test.txt‘
            
            
                
                    , 
                
            
            
                ‘r‘
            
            
                
                    )
                
            
        

标示符‘r‘表示读,这样,我们就成功地打开了一个文件。

如果文件打开成功,接下来,调用 read() 方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:

            
                >>> 
            
            
                
                    f.read()
                
            
        
            
                ‘Hello, world!‘
            
        

最后一步是调用 close() 方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

            
                >>> 
            
            
                
                    f.close()
                
            
        

由于文件读写时都有可能产生 IOError ,一旦出错,后面的 f.close() 就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用 try ... finally 来实现:

            
                try
            
            
                
                    :
                
            
        
            
                
                        
                
                f = open(
            
            
                ‘/path/to/file‘
            
            
                
                    , 
                
            
            
                ‘r‘
            
            
                
                    )
                
            
        
            
                
                        
                
            
            
                print
            
            
                
                     f.read()
                
            
        
            
                finally
            
            
                
                    :
                
            
        
            
                
                        
                
            
            
                if
            
            
                
                     f:
                
            
        
            
                
                            
                
                f.close()
            
        

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

            
                with
            
            
                
                     open(
                
            
            
                ‘/path/to/file‘
            
            
                
                    , 
                
            
            
                ‘r‘
            
            
                
                    ) 
                
            
            
                as
            
            
                
                     f:
                
            
        
            
                
                        
                
            
            
                print
            
            
                
                     f.read()
                
            
        

这和前面的 try ... finally 是一样的,但是代码更佳简洁,并且不必调用 f.close() 方法。

调用 read() 会一次性读取文件的全部内容,,要保险起见,可以反复调用 read(size) 方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

如果文件很小, read() 一次性读取最方便;如果不能确定文件大小,反复调用 read(size) 比较保险;如果是配置文件,调用 readlines() 最方便:

            
                for
            
            
                
                     line 
                
            
            
                in
            
            
                
                     f.readlines():
                
            
        
            
                
                        
                
                print(line.strip()) 
            
            
                
                    # 
                
                把末尾的
                
                    ‘n‘
                
                删掉
            
        

二进制文

要读取二进制文件,比如图片、视频等等,用 ‘rb‘ 模式打开文件即可:

            
                >>> 
            
            
                
                    f = open(
                
            
            
                ‘/Users/michael/test.jpg‘
            
            
                
                    , 
                
            
            
                ‘rb‘
            
            
                
                    )
                
            
        
            
                >>> 
            
            
                
                    f.read()
                
            
        
            
                ‘xffxd8xffxe1x00x18Exifx00x00...‘
            
            
                
                    # 
                
                
                    十六进制表示的字节
                
            
        

字符编

要读取非ASCII编码的文本文件,就必须以二进制模式打开,再解码。比如GBK编码的文件:

            
                >>> 
            
            
                
                    f = open(
                
            
            
                ‘/Users/michael/gbk.txt‘
            
            
                
                    , 
                
            
            
                ‘rb‘
            
            
                
                    )
                
            
        
            
                >>> 
            
            
                
                    u = f.read().decode(
                
            
            
                ‘gbk‘
            
            
                
                    )
                
            
        
            
                >>> 
            
            
                
                    u
                
            
        
            
                u‘u6d4bu8bd5‘
            
        
            
                >>> 
            
            
                print
            
            
                
                     u
                
            
        

如果每次都这么手动转换编码嫌麻烦(写程序怕麻烦是好事,不怕麻烦就会写出又长又难懂又没法维护的代码),Python还提供了一个codecs模块帮我们在读文件时自动转换编码,直接读出unicode

            
                import
            
            
                
                     codecs
                
            
        
            
                with
            
            
                
                     codecs.open(
                
            
            
                ‘/Users/michael/gbk.txt‘
            
            
                
                    , 
                
            
            
                ‘r‘
            
            
                
                    , 
                
            
            
                ‘gbk‘
            
            
                
                    ) 
                
            
            
                as
            
            
                
                     f:
                
            
        
            
                
                        
                
                f.read() 
            
            
                
                    # u‘u6d4bu8bd5‘
                
            
        

写文件

写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符 ‘w‘ 或者 ‘wb‘ 表示写文本文件或写二进制文件:

            
                >>> 
            
            
                
                    f = open(
                
            
            
                ‘/Users/michael/test.txt‘
            
            
                
                    , 
                
            
            
                ‘w‘
            
            
                
                    )
                
            
        
            
                >>> 
            
            
                
                    f.write(
                
            
            
                ‘Hello, world!‘
            
            
                
                    )
                
            
        
            
                >>> 
            
            
                
                    f.close()
                
            
        

你可以反复调用 write() 来写入文件,但是务必要调用 f.close() 来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close() 的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用 with 语句来得保险:

            
                with
            
            
                
                     open(
                
            
            
                ‘/Users/michael/test.txt‘
            
            
                
                    , 
                
            
            
                ‘w‘
            
            
                
                    ) 
                
            
            
                as
            
            
                
                     f:
                
            
        
            
                
                        
                
                f.write(
            
            
                ‘Hello, world!‘
            
            
                
                    )
                
            
        

 

引用模块

当我们需要引用第三方的模块代码时,可以使用import 关键字进行引用

如:import hello

需要注意的是我们需要能找到hello.py这个文件才能倒入,对于windows可以通过设置环境变量来解决这个问题

调用方式:hello.test()

            hello.py
        
            
                def
            
            
                test
            
            
                ()
            
            
                :
            
        
            
                
                        
                
                args = sys.argv
            
        
            
                
                        
                
            
            
                if
            
            
                
                     len(args)==
                
            
            
                1
            
            
                
                    :
                
            
        
            
                
                            
                
            
            
                print
            
            
                ‘Hello, world!‘
            
        
            
                
                        
                
            
            
                elif
            
            
                
                     len(args)==
                
            
            
                2
            
            
                
                    :
                
            
        
            
                
                            
                
            
            
                print
            
            
                ‘Hello, %s!‘
            
            
                
                     % args[
                
            
            
                1
            
            
                
                    ]
                
            
        
            
                
                        
                
            
            
                else
            
            
                
                    :
                
            
        
            
                
                            
                
            
            
                print
            
            
                ‘Too many arguments!‘
            
        

 

别名

使用as 关键字进行设置别名

如:import hello as h

调用方式:h.test()

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/tiankefeng19850520/article/details/47428841


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐