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]
类,对象,属性

# define classclass Me(object):
def test(self):
print "Hello!"
def new_test(): print "New Hello!"
me = Me()

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循环的数据类型有以下几种:
一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
特点:
- 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
- 不能随机访问集合中的某个值 ,只能从头到尾依次访问
- 访问到一半时不能往回退
- 便于循环比较大的数据集合,节省内存
Python 4 函数的参数,内置函数,装饰器,生成器,迭代器,的更多相关文章
- python全栈开发-Day13 内置函数
一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...
- Python学习(八) —— 内置函数和匿名函数
一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...
- python基础12_匿名_内置函数
一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...
- 【python】dir(__builtins__)查看python中所用BIF(内置函数)
dir(__builtins__)查看python中所用BIF(内置函数)
- 查看python内部模块命令,内置函数,查看python已经安装的模块命令
查看python内部模块命令,内置函数,查看python已经安装的模块命令 可以用dir(modules) 或者用 pip list或者用 help('modules') 或者用 python -m ...
- 生成器的send方法、递推函数、匿名函数及常用内置函数
生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- python补充最常见的内置函数
最常见的内置函数是: print("Hello World!") 数学运算 abs(-5) # 取绝对值,也就是5 round(2. ...
- Python基础(七)内置函数
今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...
- Python 几个重要的内置函数
所谓内置函数,就是在Python中被自动加载的函数,任何时候都可以用.内置函数,这意味着我们不必为了使用该函数而导入模块.不必做任何操作,Python 就可识别内置函数.在学习Python的过程中,有 ...
随机推荐
- 李洪强经典面试题51-KVO-KVC
李洪强经典面试题51-KVO-KVC KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用set ...
- mysql之replicate_do_table/replicate_ingore_table/replicate_wide_do_table/replicate_wide_ingore_table
参考:http://yhqlzz.blog.51cto.com/2557314/1159084/ mysql官网:http://dev.mysql.com/doc/refman/5.1/en/repl ...
- 键值对集合 dict(字典)
xx= { ss, ss } 创建字典 len(ss) 返回字典到长度,len函数可以返回任何集合的长度,list.tuple.dict都是集合的一种 什么是dict 我们已经知道,list 和 tu ...
- row format delimited fields terminated by ','
row format delimited fields terminated by ',' 以','结尾的行格式分隔字段
- 虚拟化笔记04.OpenFiler.install
4.OpenFiler install OPENFILER 介绍 1.OpenFiler 作用 OpenFiler 基于Linux 内核,主要作用是实现IP-SAN. 在VSPHERE中我们可以将VM ...
- 在虚拟机VMware Workstation上安装win7系统
之前讲过虚拟机的安装过程,虚拟机安装完成之后,就需要在虚拟机上安装操作系统了,这次就讲讲怎么在虚拟机上安装操作系统. 工具/原料 VMware Workstation win7系统盘 iso格式 ...
- 初涉Quartz
1.首先需要导入包,必须导入的包如下: quartz-1.8.5.jar commons-logging.jar spring-core-3.0.5.RELEASE.jar sprin ...
- zmq重点
The zmq_msg_send(3) method does not actually send the message to the socket connection(s). It queues ...
- iOS学习笔记(十)——iOS真机调试
前面一直使用模拟器运行,今天使用了真机调试,这一篇介绍一下真机调试.真机调试需要99$注册,如果有注册过的账号,也可以使用注册账号邀请你加入一个账号下,注册账号可以给你分配权限,我也是使用的邀请成为开 ...
- 编写自己的ls命令
····要编写ls命令,首先要了解它能做什么,完成了什么工作,是如何完成这些工作的···· 一.ls命令能做什么? 我们在命令行输入ls,ls默认找出当前目录中所有文件的文件名,并且按照字典序排序后 ...