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的过程中,有 ...
随机推荐
- 李洪强漫谈iOS开发[C语言-001]-开发概述
- Vim使用技巧(3) -- 可视化模式技巧 【持续更新】
快捷键 Esc / Ctrl + [ / v //切换到普通模式 o //切换高亮选区的光标活动端 y //将光标选中的内容复制到寄存器中 u //将光标选中的字母全部改成小写字母 U //将光标选中 ...
- golang解析json
解析json,在很多语言都是很常用的,go提供了相应的包"encoding/json"来处理.直接上代码,如下: package main import ( "encod ...
- pycharm2018.1.4激活破解方法与汉化包-2018年6月19日
记录下来备用,顺便分享给大家,有能力的还是希望能够支持正版!支持正版!支持正版! 方法1:激活服务器,最简单快速(截止2018年6月19日可用) 在激活Jetbrains旗下任意产品的时候选择激活服务 ...
- Spring MVC密码处理
以下示例显示如何在使用Spring Web MVC框架的表单中使用密码.首先使用Eclipse IDE来创建一个WEB工程,并按照以下步骤使用Spring Web Framework开发基于动态表单的 ...
- python django -1
VT Django是一款python的web开发框架 与MVC有所不同,属于MVT框架 m表示model,负责与数据库交互 v表示view,是核心,负责接收请求.获取数据.返回结果 t表示templa ...
- Openstack(Kilo)安装系列之环境准备(二)
控制节点.网络节点.计算节点: 一.配置源 1.配置EPEL源 yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-rel ...
- spring-security+hibernate4+quartz实现的心跳检测项目(转 收藏)
转自:http://www.52itstyle.com/thread-27470-1-1.html HeartBeat. ~2 Z8 U! ?8 r心跳检测各类应用服务器(如Tomcat,Jetty) ...
- (转)gethostbyname() -- 用域名或主机名获取IP地址
struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等.传出值, ...
- 【BZOJ5047】空间传送装置 最短路
[BZOJ5047]空间传送装置 Description 太空中一共有n座星球,它们之间可以通过空间传送装置进行转移.空间传送装置分为m种,第i种装置可以用4个参数a_i,b_i,c_i,d_i来描述 ...