spam函数python,spam函数-成都快上网建站

spam函数python,spam函数

享学课堂浅谈Python序列内建函数都有哪些

1、Python类型操作符和内建函数总结

目前成都创新互联已为近千家的企业提供了网站建设、域名、网页空间、网站托管运营、企业网站设计、坡头网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

表4.5列出了所有操作符和内建函数,其中操作符顺序是按优先级从高到低排列的。同一种灰度的操作符拥有同样的优先级。注意在operator模块中有这些(和绝大多数Python)操作符相应的同功能的函数可供使用。

表4.5 标准类型操作符和内建函数

操作符/函数

描 述

结 果a

字符串表示

``

对象的字符串表示

str

内建函数

cmp(obj1, obj2)

比较两个对象

int

repr(obj)

对象的字符串表示

str

str(obj)

对象的字符串表示

str

type(obj)

检测对象的类型

type

值比较

小于

bool

大于

bool

=

小于或等于

bool

=

大于或等于

bool

==

等于

bool

!=

不等于

bool

不等于

bool

对象比较

is

bool

is not

不是

bool

布尔操作符

not

逻辑反

bool

and

逻辑与

bool

or

逻辑或

bool

2、Python数值类型操作符和内建函数

一、工厂函数

数值工厂函数总结类(工厂函数) 操作

bool(obj) b 返回obj对象的布尔值,也就是 obj.__nonzero__()方法的返回值。

int(obj, base=10)   返回一个字符串或数值对象的整数表 示, 类似string.atoi();

从Python 1.6起, 引入了可选的进制参数。

long(obj, base=10) 返回一个字符或数据对象的长整数表 示,类似string.atol(),

从Python1.6起, 引入了可选的进制参数 float(obj) ,

返回一个字符串或数据对象的浮点数 表示,类似string.atof()。

complex(str) or返回一个字符串的复数表示,或 者根据给定的实数,

complex(real, imag=0.0)  (及一个可选 的虚数部分)生成一个复数对象。

二、内建函数

1、分类

Python 有五个运算内建函数用于数值运算:

abs(num), coerce(num1,num2), divmod(num1,num2), pow(num1,num2,mod=1)和 round(flt,ndig=0)

其中abs()返回给定参数的绝对值。如果参数是一个复数, 那么就返回math.sqrt(num.real2 + num.imag2).

coerce()是一个数据类型转换函数,不过它的行为更像一个运算符.数coerce()为程序员提供了不依赖Python 解释器,而是自定义两个数值类型转换的方法。对一种新创建的数值类型来说, 这个特性非常有用.函数coerce()仅返回一个包含类型转换完毕的两个数值元素的元组.

divmod()内建函数把除法和取余运算结合起来, 返回一个包含商和余数的元组.对整数来说,它的返回值就是地板除和取余操作的结果.对浮点数来说,返回的商部分是math.floor(num1/num2),对复数来说,商部分是ath.floor((num1/num2).real).

pow()它和双星号 (**)运算符都可以进行指数运算.不过二者的区别并不仅仅在于一个是运算符,一个是内建函数.在Python 1.5 之前,并没有 ** 运算符,内建函数pow()还接受第三个可选的参数,一个余数参数.如果有这个参数的, pow() 先进行指数运算,然后将运算结果和第三个参数进行取余运算.这个特性主要用于密码运算,并且比 pow(x,y) % z 性能更好, 这是因为这个函数的实现类似于C 函数pow(x,y,z).

round()用于对浮点数进行四舍五入运算。它有一个可选的小数位数参数.如果不提供小数位参数, 它返回与第一个参数最接近的整数(但仍然是浮点类型).第二个参数告诉round 函数将结果精确到小数点后指定位数.

2、函数int()/round()/math.floor()它们之间的不同之处:

函数 int()直接截去小数部分.(返回值为整数)

函数 floor() 得到最接近原数但小于原数的整数.(返回值为浮点数)

函数 round() 得到最接近原数的整数.(返回值为浮点数)

3、进制转换函数:

返回字符串表示的8 进制和16 进制整数,它们分别是内建函数:

oct()和 hex(). oct(255)='0377'/hex(255)='0xff'

函数chr()接受一个单字节整数值(0到255),返回一个字符串(ASCII),其值为对应的字符.chr(97)='a'

函数ord()则相反,它接受一个字符(ASCII 或 Unicode),返回其对应的整数值.ord('A')=65

3、Python字符串函数

(一)标准类型操作符和标准内建函数

1)、标准类型操作符

,,=,=,==,!=,对象值得比较

注:做比较时字符串是按ASCII值的大小来比较的

is 对象身份比较

and,or,not 布尔类型

2)标准内建函数

type(obj)

cmp(obj1,obj2)

str(obj)和repr(obj) 或反引号运算符(``) 可以方便的以字符串的方式获取对象的

内容、类型、数值属性等信息。str()函数得到的字符串可读性好, 而repr()函数得到的字符

串通常可以用来重新获得该对象, 通常情况下 obj == eval(repr(obj)) 这个等式是成立的

isinstance(obj,type) 判断对象的类型

(二)序列操作

1、序列操作

字符串属于序列对象,可以使用所有序列的操作和函数

切片 [] [:] [::]

简单总结:

*索引(S[i])获取特定偏移的元素。

——第一个元素偏移为0

——(S[0])获取第一个元素。

——负偏移索引意味着从最后或右边反向进行计数

——(S[-2])获取倒数第二个元素(就像S[len(s)-2]一样

*分片[S[i:j]提取对应的部分作为一个序列

——右边界不包含在内

——分片的边界默认为0和序列的长度,如果没有给出的话S[:]

——(S[1:3])获取了从偏移为1,直到但不包括偏移为3的元素

——(S[1:])获取从偏移为1到末尾之间的元素

——(S[:3])获取从偏移为0直到但不包括偏移为3的元素

——(S[:-1])获取从偏移为0直到但不包括最后一个元素之间的元素

——(S[:])获取从偏移为0到末尾之间的元素,这有效地实现了顶层S拷贝

拷贝了一个相同值,但是是不同内存区域的对象。对象字符串这样不可变的对象不是很有用,但是对于可以实地修改的对象来说很有用。

比如列表。

扩展分片:第三个限制值 【步进】

完整形式:X[I:J:K]:这标识索引X对象的元素,从偏移为I直到J-1,每隔K元素索引一次。第三个限制值,K,默认为1

实例

Python Code

1

2

3

4

5

S='abcdefghijk'

S[1:10]

'bcdefghij'

S[1:10:2]

'bdfhj

也可以使用负数作为步进。

分片表达式

Python Code

1

2

"hello"[::-1]

'olleh'

通过负数步进,两个边界的意义实际上进行了反转。

3、成员操作符 in ,not in

返回布尔值True 或False

可以使用string模块来判断输入字符的合法性,可见成品中的idcheck.py

4、字符串连接

+ 连接字符串 ‘name’+' '+'jin'

字符串格式化 '%s %s' % ('name','jin')

join()方法 ' '.join(('name','jin')) ' '.join(['name','jin'])

5、删除清空字符串

del aString

aString=''

(三)、序列函数

序列类型函数

len(str) 返回字串的长度

enumerate(iter):接受一个可迭代对象作为参数,返回一个enumerate

max(str)/min(str):max()和min()函数对其他的序列类型可能更有用,但对于string类型它们能很好地运行,返回最大或者最小的字符(按照ASCII 码值排列),

zip([it0, it1,... itN]) 返回一个列表,其第一个元素是it0,it1,...这些元素的第一个元素组成的一个元组,第二个...,类推.

reversed(seq)c 接受一个序列作为参数,返回一个以逆序访问的迭代器(PEP 322)

sorted(iter,func=None,key=None,reverse=False) 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func,key 和reverse 的含义跟list.sort()内建函数的参数含义一样.

注意:

sorted等需要在原处修改的函数无法用在字符串对象,但可以产生新的对象

sum处理的对象是数字,不能用在字符串

sorted(s)

['a', 'e', 'e', 'g', 'g', 'g', 'o']

(四)只适合于字符串类型的函数

1)raw_input()函数

内建的raw_input()函数使用给定字符串提示用户输入并将这个输入返回,下面是一个使

用raw_input()的例子:

user_input = raw_input("Enter your name: ")

prin user_input

2)str() and unicode()

str()和unicode()函数都是工厂函数,就是说产生所对应的类型的对象.它们接受一个任

意类型的对象,然后创建该对象的可打印的或者Unicode 的字符串表示. 它们和basestring 都

可以作为参数传给isinstance()函数来判断一个对象的类型

3)chr(), unichr(), and ord()

chr()函数用一个范围在range(256)内的(就是0 到255)整数做参数,返回一个对应的字符.unichr()跟它一样,只不过返回的是Unicode 字符

ord()函数是chr()函数(对于8 位的ASCII 字符串)或unichr()函数(对于Unicode 对象)

的配对函数,它以一个字符(长度为1 的字符串)作为参数,返回对应的ASCII 数值,或者Unicode

数值,如果所给的Unicode 字符超出了你的Python 定义范围,则会引发一个TypeError 的异常

(五)、只适用于字符串的操作符

1、格式化操作符 %

字符串格式化符号

格式化字符 转换方式

%c 转换成字符(ASCII 码值,或者长度为一的字符串)

%ra 优先用repr()函数进行字符串转换

%s 优先用str()函数进行字符串转换

%d / %i 转成有符号十进制数

%ub 转成无符号十进制数

%ob 转成无符号八进制数

%xb/%Xb (Unsigned)转成无符号十六进制数(x/X 代表转换后的十六进制字符的大

小写)

%e/%E 转成科学计数法(e/E 控制输出e/E)

%f/%F 转成浮点数(小数部分自然截断)

%g/%G %e 和%f/%E 和%F 的简写

%% 输出%

格式化操作符辅助指令

符号 作用

* 定义宽度或者小数点精度

- 用做左对齐

+ 在正数前面显示加号( + )

sp 在正数前面显示空格

# 在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于

用的是'x'还是'X')

0 显示的数字前面填充‘0’而不是默认的空格

% '%%'输出一个单一的'%'

(var) 映射变量(字典参数)

m.n m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

2、字符串模板: 更简单的替代品

由于新式的字符串Template 对象的引进使得string 模块又重新活了过来,Template 对象

有两个方法,substitute()和safe_substitute().前者更为严谨,在key 缺少的情况下它会报一

个KeyError 的异常出来,而后者在缺少key 时,直接原封不动的把字符串显示出

3、原始字符串操作符( r/R )

字符串抑制转义r'带特殊符号的字串'

myfile=open(r'C:\new\text.data','w')

4、Unicode 字符串操作符( u/U )

u'abc' U+0061 U+0062 U+0063

u'\u1234' U+1234

u'abc\u1234\n' U+0061 U+0062 U+0063 U+1234 U+0012

(六)字符串对象的方法:

1、删减

T2.lstrip() 移除字符串前面字符(默认空格),返回字符串

T2.rstrip() 移除字符串后面字符(默认空格),返回字符串

T2.strip() 移除字符串前后面空格,返回字符串 默认空格,可以其他字符 S.strip('"')

2、切割

partition(sep),

rpartition(sep),

splitlines([keepends]),#把S按照行分割符分为一个list,keepends是一个bool值,如果为真每行后而会保留行分割符

split([sep [,maxsplit]]),#以sep为分隔符,把S分成一个list。maxsplit表示分割的次数。默认的分割符为空白字符

rsplit([sep[,maxsplit]]) #从右到左切割

备注:

partition()函数族是2.5版本新增的方法。它接受一个字符串参数,并返回一个3个元素的 tuple 对象。

如果sep没出现在母串中,返回值是 (sep, ‘’, ‘’);

否则,返回值的第一个元素是 sep 左端的部分,第二个元素是 sep 自身,第三个元素是 sep 右端的部分。

S.partition(';')

('', ';', ' generated by /sbin/dhclient-script\nnameserver 172.16.10.171\nnameserver 8.8.8.8\nnameserver 172.16.0.2\nnameserver 178.79.131.110\nnameserver 202.96.199.133\n')

参数 maxsplit 是分切的次数,即最大的分切次数,所以返回值最多有 maxsplit+1 个元素。

s.split() 和 s.split(‘ ‘)的返回值不尽相同

' hello world!'.split()

['hello', 'world!']

' hello world!'.split(' ')

['', '', 'hello', '', '', 'world!']

S.split('\n',3)

['; generated by /sbin/dhclient-script', 'nameserver 172.16.10.171', 'nameserver 8.8.8.8', 'nameserver 172.16.0.2\nnameserver 178.79.131.110\nnameserver 202.96.199.133\n']

超过最大切割个数后面的全部为一个元素

按行切割

S

'; generated by /sbin/dhclient-script\nnameserver 172.16.10.171\nnameserver 8.8.8.8\nnameserver 172.16.0.2\nnameserver 178.79.131.110\nnameserver 202.96.199.133\n'

S.splitlines()

['; generated by /sbin/dhclient-script', 'nameserver 172.16.10.171', 'nameserver 8.8.8.8', 'nameserver 172.16.0.2', 'nameserver 178.79.131.110', 'nameserver 202.96.199.133']

产生差异的原因在于当忽略 sep 参数或sep参数为 None 时与明确给 sep 赋予字符串值时 split() 采用两种不同的算法。

对于前者,split() 先去除字符串两端的空白符,然后以任意长度的空白符串作为界定符分切字符串

即连续的空白符串被当作单一的空白符看待;

对于后者则认为两个连续的 sep 之间存在一个空字符串。因此对于空字符串(或空白符串),它们的返回值也是不同的:

''.split()

[]

''.split(' ')

['']

3、变形

lower(),#全部小写

upper(),#全部小写

capitalize(),#首字母大写

swapcase(),#大小写交换

title()#每个单词第一个大写,其他小写

备注

因为title() 函数并不去除字符串两端的空白符也不会把连续的空白符替换为一个空格,

所以建议使用string 模块中的capwords(s)函数,它能够去除两端的空白符,再将连续的空白符用一个空格代替。

Python Code

1

2

3

4

' hello world!'.title()

' Hello World!'

string.capwords(' hello world!')

'Hello World!'

4、连接

join(seq)

join() 函数的高效率(相对于循环相加而言),使它成为最值得关注的字符串方法之一。

它的功用是将可迭代的字符串序列连接成一条长字符串,如:

conf = {'host':'127.0.0.1',

... 'db':'spam',

... 'user':'sa',

... 'passwd':'eggs'}

';'.join("%s=%s"%(k, v) for k, v in conf.iteritems())

'passswd=eggs;db=spam;user=sa;host=127.0.0.1'

S=''.join(T) #使用空字符串分割把字符列表转换为字符串

5、查找

count( sub[, start[, end]]),#计算substr在S中出现的次数

find( sub[, start[, end]]),#返回S中出现sub的第一个字母的标号,如果S中没有sub则返回-1。start和end作用就相当于在S[start:end]中搜索

index( substr[, start[, end]]),#与find()相同,只是在S中没有substr时,会返回一个运行时错误

rfind( sub[, start[,end]]),#返回S中最后出现的substr的第一个字母的标号,如果S中没有substr则返回-1,也就是说从右边算起的第一次出现的substr的首字母标号

rindex( sub[, start[, end]])

T2.find('ie') 字符串方法调用:搜索

find()----找到的第一个符合字符的index

rfind()-----找到最后一个符合的字符的index

备注:

find()函数族找不到时返回-1,index()函数族则抛出ValueError异常。

另,也可以用 in 和 not in 操作符来判断字符串中是否存在某个模板

6、替换

replace(old, new[,count]),#把S中的oldstar替换为newstr,count为替换次数。这是替换的通用形式,还有一些函数进行特殊字符的替换

translate(table[,deletechars]) #使用上面的函数产后的翻译表,把S进行翻译,并把deletechars中有的字符删掉

备注:

replace()函数的 count 参数用以指定最大替换次数

translate() 的参数 table 可以由 string.maketrans(frm, to) 生成

translate() 对 unicode 对象的支持并不完备,建议不要使用

7、判定

isalnum(),#是否全是字母和数字,并至少有一个字符

isalpha(),是否全是字母,并至少有一个字符

isdigit(),是否全是数字,并至少有一个字符 ,如果是全数字返回True,否则返回False

islower(),#S中的字母是否全是小写

isupper(),#S中的字母是否是大写

isspace(),#是否全是空白字符,并至少有一个字符

istitle(),S是否是首字母大写的

startswith(prefix[, start[, end]]), #是否以prefix开头

endswith(suffix[,start[, end]]),#以suffix结尾

备注:

这些函数都比较简单,顾名知义。需要注意的是*with()函数族可以接受可选的 start, end 参数,善加利用,可以优化性能。

另,自 Py2.5 版本起,*with() 函数族的 prefix 参数可以接受 tuple 类型的实参,当实参中的某人元素能够匹配,即返回 True。

8、填充

字符串在输出时的对齐:

center(width[, fillchar]), 字符串中间对齐

ljust(width[, fillchar]), 字符串左对齐,不足部分用fillchar填充,默认的为空格

rjust(width[, fillchar]), 字符串右对齐,不足部分用fillchar填充,默认的为空格

zfill(width), 把字符串变成width长,并在右对齐,不足部分用0补足

expandtabs([tabsize])把字符串中的制表符(tab)转换为适当数量的空格。

fillchar 参数指定了用以填充的字符,默认为空格

zfill的z为zero的缩写,顾名思义,是以字符0进行填充,用于数值输出

expandtabs()的tabsize 参数默认为8。它的功能是把字符串中的制表符(tab)转换为适当数量的空格。

9、编码

encode([encoding[,errors]]),

decode([encoding[,errors]])

这是一对互逆操作的方法,用以编码和解码字符串。因为str是平台相关的,它使用的内码依赖于操作系统环境,

而unicode是平台无关的,是Python内部的字符串存储

Python函数注解使用有哪些注意事项呢?

函数注解是关于用户自定义的函数的完全可选的、随意的元数据信息。

1.无论 Python 本身或者标准库中都没有使用函数注解;本节只是描述了语法。第三方的项目是自由地为文档,类型检查,以及其它用途选择函数注解。

2.注解是以字典形式存储在函数的 __annotations__ 属性中,对函数的其它部分没有任何影响。参数注解(Parameter annotations)是定义在参数名称的冒号后面,紧随着一个用来表示注解的值得表达式。返回注释(Return annotations)是定义在一个 - 后面,紧随着一个表达式,在冒号与 - 之间。下面的示例包含一个位置参数,一个关键字参数,和没有意义的返回值注释:

def f(ham: 42, eggs: int = 'spam') - "Nothing to see here":

... print("Annotations:", f.__annotations__)

... print("Arguments:", ham, eggs)

...

f('wonderful')

Annotations: {'eggs':

, 'return': 'Nothing to see here', 'ham': 42}

Arguments: wonderful spam

python内建函数

其实安装python包会自带一个有问号标示“?”的"Python Manuals"可以仔细阅读一下,也可作帮助文档的。

介绍Python的内建函数和异常.许多内建函数的细节及特性可以在这里找到.

内建函数

本节介绍的函数在解释器中总是可用的,他们被包含在 __builtin__ 模块里.另外每个模块的 __builtins__ 属性经常指的是这个模块(除了当在restricted execution环境下运行时).

_(下划线)

默认情况下,变量 _ 用于在交互模式下表示最近一个表达式的运行结果.

参阅 sys.displayhook (118)

__import__(name [, globals [, locals [, fromlist]]])

import语句通过调用这个函数来导入模块. name是包含模块名字的字符串, globals是一个可选的定义全局名称空间的字典, locals是定义局部名称空间的字典, fromlist是from语句目标的列表.例如, import spam语句会调用__import__('spam', globals(), locals(), []) ,而from spam import foo 语句会调用 __import__('spam', globals(), locals(), ['foo']). 如果模块名在包名字之后(如foo.bar)而且fromlist为空时,就返回对应的模块对象.如果fromlist不为空,则只会返回最顶级的包.

这个函数是一个低等级的模块载入接口.它并不执行import语句的所有步骤(通常情况下局部名称空间并不会随模块中包含对象的名称引用的改变而改变.这个函数可以由用户来重新定义,这样为import语句加入新的行为.默认的执行并不会检查locals参数,而globals只用于决定包的内容(这些参数可以使 __import__()能够完整地访问全局和局部名称空间)

abs(x)

返回x的绝对值

apply(func [, args [, keywords]])

对可调用对象func执行函数调用. args是一个包含固定位置参数的元组, keywords是包含关键参数的字典. apply()函数也可以写做func(*args ,**keywords ).

buffer(sequence [, offset [, size]])

创建一个新的缓冲器对象.缓冲器通常是一个序列(如字符串)的字节导向序列.缓冲器和字符串在许多地方是相同的,但是它不支持字符串方法,而且也不能使用string模块的函数.

callable(object)

当object为可调用对象时返回True,否则返回False

chr(i)

将一个0到255的整数转换为一个字符.

cmp(x,y)

比较x和y. x y返回负数; x== y返回零; x y返回整数.它可以比较任意两个对象并返回结果,即使有时候对象的比较豪无意义(例如比较文件对象).在某些环境下,这样的比较会引发异常.

coerce(x,y)

将x和y值转换为同一个数值类型并作为一个元组返回.(第三章,类型和对象)

compile(string, filename, kind)

使用exec()或eval()将字符串编译为代码对象. filename is a string containing the name of the file in which the string was defined. kind为'exec'时代表一个表达式的序列, 'eval'代表一个表达式, 'single'代表一个运行语句.

complex(real [, imag])

创建一个复数

delattr(object, attr)

删除对象的一个属性, attr是一个字符串.与 del object.attr相同

dir([object])

返回包含属性名称的列表.它们来自对象的 __dict__, __methods__,以及 __members__ 属性.如果没有传递给它参数,则会返回当前的local symbol table

divmod(a,b)

返回一个包含商和余数的元组.对于整数,将返回(a / b , a % b ),对于浮点数,将返回(math.floor(a / b ), a % b )

eval(expr [, globals [, locals]])

计算一个表达式的值. expr是一个字符串或由compile()创建的一个代码对象. globals和locals为操作定义的全局和局部名称空间,当省略时,表达式将在调用时的名称空间计算.

execfile(filename [, globals [, locals]])

运行文件filename中的语句. globals和locals定义了文件运行的全局和局部名称空间,当省略时,文件将在调用时的名称空间运行.这个函数不能在一个函数主体里使用,因为它与内嵌范围不相容.

filter(function, list)

使用func()函数来过滤s中的元素.使func返回值为false的元素被丢弃,其它的存入filter函数返回的列表中.如果function是None,则list中值为False的元素就被删除.

float(x)

将x转换为浮点数

getattr(object, name [, default])

返回一个对象的属性. name是一个字符串. default是一个可选的值,代表当没有这个属性时返回的值. 与 object.name 结果相同

globals()

返回一个与全局名称空间对应的字典

hasattr(object, name)

返回object是否有name属性,布尔值

hash(object)

返回一个对象的整数哈希值(如果可能).两个相等对象的哈希值是相同的.模块没有定义一个哈希值.

hex(x)

将一个整数或长整数转换为一个十六进制的字符串

id(object)

返回一个对象的整数id

input([prompt])

相当于eval(raw_input(prompt ))

int(x [, base])

将一个数字或字符串转换为整数. 可选参数base代表从字符串转换时的基础/根据

intern(string)

Checks to see whether string is contained in an internal table of strings. If found, a copy of the internal string is returned. If not, string is added to the internal table and returned. This function is primarily used to get better performance in operations involving dictionary lookups. Interned strings are never garbage-collected. Not applicable to Unicode strings.

isinstance(object, classobj)

检查object是否是classobj的事例或子类.也可用于检查类型

issubclass(class1, class2)

检查class1是否是class2的子类(派生类)

注意: issubclass(A , A )返回True

len(s)

返回序列s中包含的条目数目

list(s)

返回一个包含序列s中条目的新列表

locals()

返回一个与调用时局部名称空间相对应的字典

long(x [, base])

将一个数字或字符串转换为长整数,可选参数base代表从字符串转换时的基础/根据

map(function, list, ...)

将序列list中的每个元素传递给function函数做参数,函数的返回值组成列表并返回.如果提供给多个列表,则函数应包含有多个参数,每个参数从不同的列表获得.如果函数为None,则默认为 identity function(?身份函数).如果None映射到多个列表,则返回一个包含元组的列表,元组的每个元素分别来自各个列表.如果有必要,短的列表将使用None来扩充到与最长列表长度相等. map可以使用list comprehensions 来代替.例如map(function , alist ),可以使用[function (x) for x in alist ]来代替

参阅 zip (105).

max(s [, args, ...])

单个参数时,返回序列s中的最大值.多个参数时,返回值最大的参数

min(s [, args, ...])

单个参数时,返回序列s中的最小值.多个参数时,返回值最小的参数

oct(x)

将一个整数或者长整数转换为八进制字符串

open(filename [, mode [, bufsize]])

打开文件filename并返回一个文件对象(第十章,运行环境). mode代表文件打开的模式. 'r' 表示读, 'w' 表示写, 'a' 表示在文件末尾添加内容. 还有一种更新模式,你只要在读写模式后增加一个'+'就可以使用这种模式,如'r+' 或 'w+'.当一个文件以更新模式打开,你就可以对这个文件进行读写操作.只要在任何读取操作之前刷新所有的输出缓冲就不会有问题.如果一个文件以 'w+' 模式打开,它的长度就度截为 0.当mode省略时,将会使用'w'模式.bufsize参数指定了缓冲行为, 0代表无缓冲,1代表行缓冲,其他正数代表一个大约的字节缓冲器大小,负数代表使用系统默认缓冲器大小(也是默认行为)

ord(c)

返回单个字符c的整数顺序值.普通字符返回[0,255]中的一个值,Unicode字符返回 [0,65535]中的一个值

pow(x, y [, z])

返回x ** y ,如果z存在返回(x ** y ) % z

range([start,] stop [, step])

返回一个从start到stop的整数序列, step代表步进,默认值为1. start默认值为0.负数的step可以创建一个递减的整数序列

参阅xrange (105)

raw_input([prompt])

从标准输入(sys.stdin)中读取一行,并把它作为字符串返回.如果提供了prompt,它将首先打印到标准输出(sys.stdout).当读取到一个EOF时,就会引发一个EOFError异常.如果readline模块被导入,那么这个函数会使用它来提供更高级的功能

reduce(func, seq [, initializer])

函数从一个序列收集信息,然后只返回一个值(例如求和,最大值,等).它首先以序列的前两个元素调用函数,再将返回值和第三个参数作为参数调用函数,依次执行下去,返回最终的值. func函数有且只有两个参数.在seq为空时,将使用初始值initializer.

reload(module)

重新导入一个已经导入的模块. module必须是一个已经存在的模块对象.一般情况下并不鼓励使用这个函数,除了在调试的时候.

当一个模块重导入时,定义它的全局名称空间的字典依然存在.Thus, definitions in the old module that aren’t part of the newly reloaded module are retained.模块可以利用这个来检查他们是否已经被导入.

重导入一个使用C编写的模块通常是不合法的

If any other modules have imported this module by using the from statement, they’ll continue to use the definitions in the previously imported module. This problem can be avoided by either reissuing the from statement after a module has been reloaded or using fully qualified names such as module.name .

如果有使用以前模块中类创建的实例,它们将继续使用以前的模块

repr(object)

返回一个对象的标准字符串表示.与向后的引号 `object` 相同.大多数情况下,返回的字符串可以使用eval()来再次创建这个对象.

round(x [, n])

Returns the result of rounding the floating-point number x to the closest multiple of 10 to the power minus n . If n is omitted, it defaults to 0. If two multiples are equally close, rounding is done away from 0 (例如, 0.5 is rounded to 1.0 and -0.5 is rounded to -1.0).

setattr(object, name, value)

设置一个对象的属性. name是一个字符串. 相当于object.name = value .

slice([start,] stop [, step])

返回一个代表指定数列中一个整数的切片对象.切片对象也可以有扩展切片操作语句来产生.(第三章,序列和映射方法)

str(object)

返回表示对象的可打印形式的字符串.与print语句产生的字符串相同.

tuple(s)

从序列s中创建一个元组.如果s已经是一个元组,则返回s

type(object)

返回object的类型,它是一个types模块中定义type类型

参阅isinstance (102)

unichr(i)

将一个0到65535的整数转换为一个Unicode字符

unicode(string [, encoding [, errors]])

将string转换为Unicode字符串. encoding指定了string的数据编码,它被省略时,将使用sys.getdefaultencoding(). errors指定编码错误处理方式.('strict', 'ignore', 或 'replace' .参阅第三章和第九章中有关Unicode内容)

vars([object])

返回object的 symbol table (通常在object的__dict__属性).如果没有给它提供参数,则返回对应当前局部名称空间的字典.

xrange([start,] stop [, step])

和range函数相似,但返回的是一个XRangeType对象.它生成一个迭代器,就是只有用那个数时才临时通过计算提供值,而不是全部储存它们.这样在处理大的数列时能节省大量的内存.

zip(s1 [, s2 [,..]])

用来将几个序列组合成一个包含元组的序列,序列中的每个元素t[i ] = (s1[i ], s2[i ], ..., sn[i ]).结果与最短序列的长度相等.

python如何获取函数的参数名

我这里用的是IDLE(我自己也觉得有点低端),Python3(2应该也可以)

help()

Welcome to Python 3.7's help utility!

If this is your first time using Python, you should definitely check out

the tutorial on the Internet at .

Enter the name of any module, keyword, or topic to get help on writing

Python programs and using Python modules. To quit this help utility and

return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type

"modules", "keywords", "symbols", or "topics". Each module also comes

with a one-line summary of what it does; to list the modules whose name

or summary contain a given string such as "spam", type "modules spam".

help sum

Help on built-in function sum in module builtins:

sum(iterable, start=0, /)

Return the sum of a 'start' value (default: 0) plus an iterable of numbers

When the iterable is empty, return the start value.

This function is intended specifically for use with numeric values and may

reject non-numeric types.

解释一下:先在Shell输入help(),它就会问你你要哪个函数的说明。然后你输入对应函数(比如sum),就可以看到这一行:sum(iterable, start=0, /),也就是说你要先输入iterable参数,start可以选择输入(有默认值)。

或者还有一种方法:用的时候直接输入函数加上左括号 比如sum( 然后你就可以看到下面有一个框,然后按照说明写就好了。如果不小心不见了,就可以把左括号去掉再重新输入,就可以再看到这个框啦!

python如何写 spam=10

spam=10

这本身就是一行合法的python代码,意为创建(若已存在则覆盖原变量)一个名为spam的int类型变量并赋值为10。

题主的意图是这样吗?

Python 里为什么函数可以返回一个函数内部定义的函数

“在Python中,函数本身也是对象”

这一本质。那不妨慢慢来,从最基本的概念开始,讨论一下这个问题:

1. Python中一切皆对象

这恐怕是学习Python最有用的一句话。想必你已经知道Python中的list, tuple, dict等内置数据结构,当你执行:

alist = [1, 2, 3]

时,你就创建了一个列表对象,并且用alist这个变量引用它:

当然你也可以自己定义一个类:

class House(object):

def __init__(self, area, city):

self.area = area

self.city = city

def sell(self, price):

[...] #other code

return price

然后创建一个类的对象:

house = House(200, 'Shanghai')

OK,你立马就在上海有了一套200平米的房子,它有一些属性(area, city),和一些方法(__init__, self):

2. 函数是第一类对象

和list, tuple, dict以及用House创建的对象一样,当你定义一个函数时,函数也是对象:

def func(a, b):

return a+b

在全局域,函数对象被函数名引用着,它接收两个参数a和b,计算这两个参数的和作为返回值。

所谓第一类对象,意思是可以用标识符给对象命名,并且对象可以被当作数据处理,例如赋值、作为参数传递给函数,或者作为返回值return 等

因此,你完全可以用其他变量名引用这个函数对象:

add = func

这样,你就可以像调用func(1, 2)一样,通过新的引用调用函数了:

print func(1, 2)

print add(1, 2) #the same as func(1, 2)

或者将函数对象作为参数,传递给另一个函数:

def caller_func(f):

return f(1, 2)

if __name__ == "__main__":

print caller_func(func)

可以看到,

函数对象func作为参数传递给caller_func函数,传参过程类似于一个赋值操作f=func;

于是func函数对象,被caller_func函数作用域中的局部变量f引用,f实际指向了函数func;cc

当执行return f(1, 2)的时候,相当于执行了return func(1, 2);

因此输出结果为3。

3. 函数对象 vs 函数调用

无论是把函数赋值给新的标识符,还是作为参数传递给新的函数,针对的都是函数对象本身,而不是函数的调用。

用一个更加简单,但从外观上看,更容易产生混淆的例子来说明这个问题。例如定义了下面这个函数:

def func():

return "hello,world"

然后分别执行两次赋值:

ref1 = func #将函数对象赋值给ref1

ref2 = func() #调用函数,将函数的返回值("hello,world"字符串)赋值给ref2

很多初学者会混淆这两种赋值,通过Python内建的type函数,可以查看一下这两次赋值的结果:

In [4]: type(ref1)

Out[4]: function

In [5]: type(ref2)

Out[5]: str

可以看到,ref1引用了函数对象本身,而ref2则引用了函数的返回值。通过内建的callable函数,可以进一步验证ref1是可调用的,而ref2是不可调用的:

In [9]: callable(ref1)

Out[9]: True

In [10]: callable(ref2)

Out[10]: False

传参的效果与之类似。

4. 闭包LEGB法则

所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象

听上去的确有些复杂,还是用一个栗子来帮助理解一下。假设我们在foo.py模块中做了如下定义:

#foo.py

filename = "foo.py"

def call_func(f):

return f() #如前面介绍的,f引用一个函数对象,然后调用它

在另一个func.py模块中,写下了这样的代码:

#func.py

import foo #导入foo.py

filename = "func.py"

def show_filename():

return "filename: %s" % filename

if __name__ == "__main__":

print foo.call_func(show_filename) #注意:实际发生调用的位置,是在foo.call_func函数中

当我们用python func.py命令执行func.py时输出结果为:

chiyu@chiyu-PC:~$ python func.py

filename:func.py

很显然show_filename()函数使用的filename变量的值,是在与它相同环境(func.py模块)中定义的那个。尽管foo.py模块中也定义了同名的filename变量,而且实际调用show_filename的位置也是在foo.py的call_func内部。

而对于嵌套函数,这一机制则会表现的更加明显:闭包将会捕捉内层函数执行所需的整个环境:

#enclosed.py

import foo

def wrapper():

filename = "enclosed.py"

def show_filename():

return "filename: %s" % filename

print foo.call_func(show_filename) #输出:filename: enclosed.py

实际上,每一个函数对象,都有一个指向了该函数定义时所在全局名称空间的__globals__属性:

#show_filename inside wrapper

#show_filename.__globals__

{

'__builtins__': module '__builtin__' (built-in), #内建作用域环境

'__file__': 'enclosed.py',

'wrapper': function wrapper at 0x7f84768b6578, #直接外围环境

'__package__': None,

'__name__': '__main__',

'foo': module 'foo' from '/home/chiyu/foo.pyc', #全局环境

'__doc__': None

}

当代码执行到show_filename中的return "filename: %s" % filename语句时,解析器按照下面的顺序查找filename变量:

Local - 本地函数(show_filename)内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的filename变量;

Enclosing - 直接外围空间(上层函数wrapper)的本地作用域,查找filename变量(如果有多层嵌套,则由内而外逐层查找,直至最外层的函数);

Global - 全局空间(模块enclosed.py),在模块顶层赋值的filename变量;

Builtin - 内置模块(__builtin__)中预定义的变量名中查找filename变量;

在任何一层先找到了符合要求的filename变量,则不再向更外层查找。如果直到Builtin层仍然没有找到符合要求的变量,则抛出NameError异常。这就是变量名解析的:LEGB法则。

总结:

闭包最重要的使用价值在于:封存函数执行的上下文环境;

闭包在其捕捉的执行环境(def语句块所在上下文)中,也遵循LEGB规则逐层查找,直至找到符合要求的变量,或者抛出异常。

5. 装饰器语法糖(syntax sugar)

那么闭包和装饰器又有什么关系呢?

上文提到闭包的重要特性:封存上下文,这一特性可以巧妙的被用于现有函数的包装,从而为现有函数更加功能。而这就是装饰器。

还是举个例子,代码如下:

#alist = [1, 2, 3, ..., 100] -- 1+2+3+...+100 = 5050

def lazy_sum():

return reduce(lambda x, y: x+y, alist)

我们定义了一个函数lazy_sum,作用是对alist中的所有元素求和后返回。alist假设为1到100的整数列表:

alist = range(1, 101)

但是出于某种原因,我并不想马上返回计算结果,而是在之后的某个地方,通过显示的调用输出结果。于是我用一个wrapper函数对其进行包装:

def wrapper():

alist = range(1, 101)

def lazy_sum():

return reduce(lambda x, y: x+y, alist)

return lazy_sum

lazy_sum = wrapper() #wrapper() 返回的是lazy_sum函数对象

if __name__ == "__main__":

lazy_sum() #5050

这是一个典型的Lazy Evaluation的例子。我们知道,一般情况下,局部变量在函数返回时,就会被垃圾回收器回收,而不能再被使用。但是这里的alist却没有,它随着lazy_sum函数对象的返回被一并返回了(这个说法不准确,实际是包含在了lazy_sum的执行环境中,通过__globals__),从而延长了生命周期。

当在if语句块中调用lazy_sum()的时候,解析器会从上下文中(这里是Enclosing层的wrapper函数的局部作用域中)找到alist列表,计算结果,返回5050。

当你需要动态的给已定义的函数增加功能时,比如:参数检查,类似的原理就变得很有用:

def add(a, b):

return a+b

这是很简单的一个函数:计算a+b的和返回,但我们知道Python是 动态类型+强类型 的语言,你并不能保证用户传入的参数a和b一定是两个整型,他有可能传入了一个整型和一个字符串类型的值:

In [2]: add(1, 2)

Out[2]: 3

In [3]: add(1.2, 3.45)

Out[3]: 4.65

In [4]: add(5, 'hello')

---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

/home/chiyu/ipython-input-4-f2f9e8aa5eae in module()

---- 1 add(5, 'hello')

/home/chiyu/ipython-input-1-02b3d3d6caec in add(a, b)

1 def add(a, b):

---- 2 return a+b

TypeError: unsupported operand type(s) for +: 'int' and 'str'

于是,解析器无情的抛出了一个TypeError异常。

动态类型:在运行期间确定变量的类型,python确定一个变量的类型是在你第一次给他赋值的时候;

强类型:有强制的类型定义,你有一个整数,除非显示的类型转换,否则绝不能将它当作一个字符串(例如直接尝试将一个整型和一个字符串做+运算);

因此,为了更加优雅的使用add函数,我们需要在执行+运算前,对a和b进行参数检查。这时候装饰器就显得非常有用:

import logging

logging.basicConfig(level = logging.INFO)

def add(a, b):

return a + b

def checkParams(fn):

def wrapper(a, b):

if isinstance(a, (int, float)) and isinstance(b, (int, float)): #检查参数a和b是否都为整型或浮点型

return fn(a, b) #是则调用fn(a, b)返回计算结果

#否则通过logging记录错误信息,并友好退出

logging.warning("variable 'a' and 'b' cannot be added")

return

return wrapper #fn引用add,被封存在闭包的执行环境中返回

if __name__ == "__main__":

#将add函数对象传入,fn指向add

#等号左侧的add,指向checkParams的返回值wrapper

add = checkParams(add)

add(3, 'hello') #经过类型检查,不会计算结果,而是记录日志并退出

注意checkParams函数:

首先看参数fn,当我们调用checkParams(add)的时候,它将成为函数对象add的一个本地(Local)引用;

在checkParams内部,我们定义了一个wrapper函数,添加了参数类型检查的功能,然后调用了fn(a, b),根据LEGB法则,解释器将搜索几个作用域,并最终在(Enclosing层)checkParams函数的本地作用域中找到fn;

注意最后的return wrapper,这将创建一个闭包,fn变量(add函数对象的一个引用)将会封存在闭包的执行环境中,不会随着checkParams的返回而被回收;

当调用add = checkParams(add)时,add指向了新的wrapper对象,它添加了参数检查和记录日志的功能,同时又能够通过封存的fn,继续调用原始的add进行+运算。

因此调用add(3, 'hello')将不会返回计算结果,而是打印出日志:

chiyu@chiyu-PC:~$ python func.py

WARNING:root:variable 'a' and 'b' cannot be added

有人觉得add = checkParams(add)这样的写法未免太过麻烦,于是python提供了一种更优雅的写法,被称为语法糖:

@checkParams

def add(a, b):

return a + b

这只是一种写法上的优化,解释器仍然会将它转化为add = checkParams(add)来执行。

6. 回归问题

def addspam(fn):

def new(*args):

print "spam,spam,spam"

return fn(*args)

return new

@addspam

def useful(a,b):

print a**2+b**2

首先看第二段代码:

@addspam装饰器,相当于执行了useful = addspam(useful)。在这里题主有一个理解误区:传递给addspam的参数,是useful这个函数对象本身,而不是它的一个调用结果;

再回到addspam函数体:

return new 返回一个闭包,fn被封存在闭包的执行环境中,不会随着addspam函数的返回被回收;

而fn此时是useful的一个引用,当执行return fn(*args)时,实际相当于执行了return useful(*args);

最后附上一张代码执行过程中的引用关系图,希望能帮助你理解:


当前名称:spam函数python,spam函数
文章URL:http://kswjz.com/article/hddohg.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流