Python 4 函数的参数,内置函数,装饰器,生成器,迭代器,

一、函数的参数:

1、位置参数:调用函数时根据函数定义的参数位置来传递参数。

2、关键字参数:用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

3、默认参数:用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)

4、参数组:有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。

基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)
例:
def name(a,b,c,d=1,*args,**kwargs):
    print(a,b,c,d,args,kwargs)
name(2,2,3,33,'asda',asd=1212,bbs=1213)
输出:
2 2 3 33 ('asda',) {'asd': 1212, 'bbs': 1213}

注:*args 表示任何多个无名参数,它是一个tuple;**kwargs 表示关键字参数,它是一个dict。并且同时使用*args**kwargs时,必须*args参数列要在**kwargs

二、内置函数:

Python内置(built-in)函数随着python解释器的运行而创建。在Python的程序中,你可以随时调用这些函数,不需要定义。最常见的内置函数是:

print("Hello World!")

在Python教程中,我们已经提到下面一些内置函数:

基本数据类型 type()
反过头来看看 dir() help() len()
词典 len()
文本文件的输入输出 open()
循环设计 range() enumerate() zip()
循环对象 iter()
函数对象 map() filter() reduce()

下面我采取的都是实际的参数,你可以直接在命令行尝试效果。

数学运算

abs(-5)                          # 取绝对值,也就是5
round(2.6)                       # 四舍五入取整,也就是3.0
pow(2, 3)                        # 相当于2**3,如果是pow(2, 3, 5),相当于2**3 % 5
cmp(2.3, 3.2)                    # 比较两个数的大小
divmod(9,2)                      # 返回除法结果和余数
max([1,5,2,9])                   # 求最大值
min([9,2,-4,2])                  # 求最小值
sum([2,-1,9,12])                 # 求和

类型转换

int(")                         # 转换为整数 integer
float(2)                         # 转换为浮点数 float
long(")                       # 转换为长整数 long integer
str(2.3)                         # 转换为字符串 string
complex(3, 9)                    # 返回复数 3 + 9i
ord("A")                         # "A"字符对应的数值
chr(65)                          # 数值65对应的字符
unichr(65)                       # 数值65对应的unicode字符
bool(0)                          # 转换为相应的真假值,在Python中,0相当于False
在Python中,下列对象都相当于False: [], (), {}, 0, None, 0.0, ''
bin(56)                          # 返回一个字符串,表示56的二进制数
hex(56)                          # 返回一个字符串,表示56的十六进制数
oct(56)                          # 返回一个字符串,表示56的八进制数
list((1,2,3))                    # 转换为表 list
tuple([2,3,4])                   # 转换为定值表 tuple
slice(5,2,-1)                    # 构建下标对象 slice
dict(a=1,b="hello",c=[1,2,3])    # 构建词典 dictionary

序列操作

all([True, 1, "hello!"])         # 是否所有的元素都相当于True值
any(["", 0, False, [], None])    # 是否有任意一个元素相当于True值
sorted([1,5,3])                  # 返回正序的序列,也就是[1,3,5]
reversed([1,5,3])                # 返回反序的序列,也就是[3,5,1]

类,对象,属性

Python 4   函数的参数,内置函数,装饰器,生成器,迭代器,
# define classclass Me(object):
    def test(self):
        print "Hello!"
def new_test():    print "New Hello!"
me = Me()
Python 4   函数的参数,内置函数,装饰器,生成器,迭代器,
hasattr(me, "test")               # 检查me对象是否有test属性
getattr(me, "test")               # 返回test属性
setattr(me, "test", new_test)     # 将test属性设置为new_test
delattr(me, "test")               # 删除test属性
isinstance(me, Me)                # me对象是否为Me类生成的对象 (一个instance)
issubclass(Me, object)            # Me类是否为object类的子类

编译,执行

repr(me)                          # 返回对象的字符串表达
compile("print('Hello')",'test.py','exec')       # 编译字符串成为code对象
eval("1 + 1")                     # 解释字符串表达式。参数也可以是compile()返回的code对象
exec("print('Hello')")            # 解释并执行字符串,print('Hello')。参数也可以是compile()返回的code对象

其他

input("Please input:")            # 等待输入
globals()                         # 返回全局命名空间,比如全局变量名,全局函数名
locals()                          # 返回局部命名空间

三、装饰器:

装饰器的定义:本质是函数,为其他函数添加附加功能。
原则:1、不能修改被装饰函数的源代码。
     2、不能修改被装饰函数的调用方式。高阶函数+嵌套函数组成装饰器高阶函数:1、函数返回值返回一个函数名。        2、把函数变量名作为变量传到函数里。嵌套函数:函数体里有用def定义的函数。

例:

1、为函数增加计算运行时间的功能:
import time
def count_time(func):
    def inner():
        start_time = time.time()
        func()
        end_time = time.time()
        print('Time is:',end_time - start_time)
    return inner

@count_time         #method1=count_time(method1)=inner
def method1():
    time.sleep(0.7)
    print('Is in method1')
@count_time
def method2():
    time.sleep(0.8)
    print('Is in method2')

method1()
method2()
输出:
Is in method1
Time is: 0.7000398635864258
Is in method2
Time is: 0.8000457286834717
2、如果被修饰函数增加参数并且有返回值:
import time
def count_time(func):
    def inner(*args,**kwargs):
        start_time = time.time()
        asc = func(*args,**kwargs)
        end_time = time.time()
        print('Time is:',end_time - start_time)
        return asc
    return inner

@count_time
def method1(name,age):
    time.sleep(0.7)
    print('Is in method1',name,age)
    return 'Sleep 0.7s'
@count_time
def method2():
    time.sleep(0.8)
    print('Is in method2')

print(method1('cheng',24))
method2()
输出:
Is in method1 cheng 24
Time is: 0.700040340423584
Sleep 0.7s
Is in method2
Time is: 0.8000457286834717

3、装饰器带参数:
import time
def count_time(func):
    print(func)
    def inner1(method):
        def inner2(*args, **kwargs):
            start_time = time.time()
            asc = method(*args, **kwargs)
            end_time = time.time()
            print('Time is:', end_time - start_time)
            return asc
        return inner2
    return inner1

@count_time(func='pass')  #method1 = count_time(func='pass')(method1)=inner1(method1)=inner2
def method1(name,age):
    time.sleep(0.7)
    print('Is in method1',name,age)
    return 'Sleep 0.7s'
@count_time(func='cla')
def method2():
    time.sleep(0.8)
    print('Is in method2')

print(method1('cheng',24))
method2()
输出:
pass
cla
Is in method1 cheng 24
Time is: 0.700040340423584
Sleep 0.7s
Is in method2
Time is: 0.8000457286834717

四、迭代器&生成器

生成器generator:

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

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

迭代器:

  我们已经知道,可以直接作用于for循环的数据类型有以下几种:

  一类是集合数据类型,如listtupledictsetstr等;一类是generator,包括生成器和带yield的generator function。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:

  而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

  迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

特点:

  1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
  2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
  3. 访问到一半时不能往回退
  4. 便于循环比较大的数据集合,节省内存
上一篇:iOS下移除按钮原生样式


下一篇:vue的首页渲染了两次的原因以及解决方法