python的一些函数部分

1.函数的嵌套定义:在函数里面定义一个函数。

2.装饰器装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。装饰器的作用就是为已经存在的对象添加额外的功能。其实总体说起来,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问

#!/usr/bin/env python
import time
import datetime  
 
def func(fc):
    print "haha"
    def wrap(*arg,**kwargs):
        start =datetime.datetime.now()
        fc(*arg,**kwargs)
        end =datetime.datetime.now()      //计算函数运行时间
        cost = end-start
        print cost.total_seconds()      //输出运行时间
 
    return wrap
 
@func                 //装饰器的调用
def f1(arg1):
    print arg1
    time.sleep(2)      
def f2():
    print "666"
#f = func(f1)
f1(arg1=100)

@func作为装饰器函数,该装饰器的作用相当于:f1=func(f1),但是,注意在使用装饰器函数时,所需要装饰的函数必须要紧跟在该函数后


本质上,decorator装饰函数就是一个返回函数的高阶函数。所以,我们要定义一个能打印日志的decorator,可以定义如下:

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

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

@logdef now():
    print ‘2013-12-25‘

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

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

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

now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

3.匿名函数:lambda定义匿名函数。声明方式不一样,调用方式是一样的

>>> f = lambda *x:map(lambda x:x+10,x)

>>> f(1,2,3)

[11, 12, 13]

>>> f(*[1,2,3,4])

[11, 12, 13, 14]

#!/usr/bin/env python

func = {

"add":lambda x,y: x+y,

"sub":lambda x,y: x-y,

"mul":lambda x,y: x*y,

"div":lambda x,y: x/y,

}

print func["add"](1,2)

4.生成器函数:可以从外面接受哟一个值,再进行计算,把值返回出去。

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

生成器

保存了当前的状态,需要调用

生成器生成的就是个迭代器。

>>> gen = (x+2 for x in range(5))

>>> gen

<generator object <genexpr> at 0x7f7817e50dc0>

>>> gen.next()

2

>>> gen.next()

3                      //前面的不见了因为用完next后,游标移动到下一位。

>>> for i in gen:

...     print i

...

4

5

6

(一般来说出现yield的函数是生成器函数)

——————————————————————————————————————————

def  odd():

alue >=10:

break

n = 1

while True:

yield n    //  中断(交出CPU),保存当前信息。返回n的值(不打印)

alue >=10:

break

n += 2

o = odd()

o.next()     //执行生成器(里面的代码)   // print o.nsxt() 打印出来

____________________________________________________________________________________

//既有return又有yield//如果先遇到return 也会中断。

.close  关掉生成器。

这里,最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

(####多进程多线程。####awk###rsinc####这些东西可以了解一下!)

send //为什么不用 .next ?因为它不可以传值进去。

#!/usr/bine/env python

def gen():

val = 0

while True:

recv=yield val      //recv接受值,yield返回值。

if recv == ‘e‘:

break

elif recv == ‘haha‘:

val = ‘hehe‘

elif recv == ‘byebye‘:

val = ‘gun!‘

else:

val = ‘?????‘

g = gen()

g.send(None)         ///send有隐饰的next的含义,当为None的时候,不往下执行

while True:

text = raw_input("ples input:")

if text == ‘e‘:

print "3q"

break

print g.send(text)          //打印出传第的值

generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。

要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

时间: 2024-10-11 04:07:29

python的一些函数部分的相关文章

如何理解Python的Main函数?

作者:蟒蛇帝国(ID:Pythondg) 难度:初级 演示环境:OS:ubuntu 16.04Python:3.6 编写 Python 代码的时候我们经常看到下面这条语句.貌似是 Python 的 Main 函数.那它具体是什么意思呢. if __name__ == '__main__':     print('hello world') 首先 Python 里有两个概念, 源码文件: ~/code_house/py_dev$ tree . ├── file1.py ├── file2.py └

python 集合、函数

*集合: set:持有一系列元素,但是set元素没有重复,并且无序 如何创建:set()并传入一个list,list的元素将作为set 的元素. s=set(['a','b','c']) print(s)    //set(['a', 'c', 'b']) print(len(s))  //3 如何访问:用in操作符判断有没有 =([,,,]) ( )//True set的特点: 1.内部结构和字典很像,唯一区别是不存储value =([,,,,,,]) x1=x2=x1 :     () (x

python基础教程函数参数

python里有很多的内置函数给我们的工作带来了很多发便利,在我们实现某些功能或者优化代码的时候,可以自己定义一个函数,同时我们在定义一个类的时候也会用到函数的一些知识去构造一个方法,这里就涉及到一些关于函数的基础知识和函数传参的知识. 一.函数的相关介绍 1.函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 函数特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 2.函数的定义示例 定义一个函数要使用def语句,依次写出函数名.括

Python的功能函数如何使用?

Python开发中的函数提供了有组织的,可重用的代码来执行一组操作.函数简化了编码过程,防止冗余逻辑,并使代码更容易遵循. 定义和调用简单函数 使用 def 语句来定义Python中的函数最常见的方式. 这种说法是所谓的单条复合语句 的语法如下: def function_name(parameters): statement(s) function_name 被称为 标识符 的功能. 由于函数定义是一个可执行语句其执行 绑定 功能名称可以在以后使用的标识符被称为函数对象. parameters

python基础——sorted()函数

python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来. Python内置的sorted()函数就可以对list进行排序: >>> sorted([36, 5, -12, 9, -21]) [-21, -12, 5, 9, 36] 此外,sorted()函数也是一个

python内置函数proprety()

property 可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/getter也是需要的 假设定义了一个类Cls,该类必须继承自object类,有一私有变量__x 1. 第一种使用属性的方法: class Cls(object):     def __init__(self):         self.__x = None           def getx(self):         return self.__x        

Python的main函数

初学Python,写C++时,习惯写上main函数,作为程序入口, 但是,在写Python时,只能看见 __name__ == "__main__", 于是,探个究竟,Python程序从哪开始?啧啧,虽然它多数是脚本~ 转自下面链接的一段话: http://blog.163.com/benben_long/blog/static/199458243201212123099/ if __name__=="__main__":     print("main&

Python内置函数_数学运算类

本文和大家分享的主要是python内置函数数据运算类相关内容,一起来看看吧,希望对大家学习python 有所帮助. abs abs(x) 求绝对值 · X可以是整型,也可以是复数 · 若X是复数,则返回复数的模 >>> abs(-1)1>>> abs(-3+4j)5.0>>> bin bin(x) 将整数x转换为二进制字符串 >>> bin(2)'0b10'>>> bin(3)'0b11' bool bool([x]

python内置函数4-eval()

Help on built-in function eval in module __builtin__: eval(...) eval(source[, globals[, locals]]) -> value Evaluate the source in the context of globals and locals. The source may be a string representing a Python expression or a code object as retur

Python之编写函数

Python之编写函数 在Python中,定义一个函数要使用 def 语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回. 我们以自定义一个求绝对值的 my_abs 函数为例: def my_abs(x): if x >= 0: return x else: return -x 请注意,函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑. 如果没