Python 函数

一.基本概念:
1.定义:逻辑结构化和过程化的一种编程方法;一个程序由多个任务构成,一个函数就代表一个任务/功能

2.函数是代码复用的通用机制

3.函数就是1个类型为function的变量:

python中函数定义方法:   
def test(x):
    '''The function definitions'''
    x+=1/y=x+1
    return x/y
       
def:定义函数的关键字
test:函数
():内可定义形参(自变量),数量可以为任意个
 "":文档描述,函数功能(非必要,但强烈建议为你的函数添加描述信息)
 x+=1:泛指代码块或程序处理逻辑(函数)
 return:定义返回值
 print(test)会返回函数的内存地址
调用运行函数:test(x1)(定义时有几个参数就写几个)

4.利用函数名是变量这一点取代多分枝

def foo():
    print('foo')

def bar():
    print('bar')

dic={'foo':foo,'bar':bar,}

while True:
    choice=input('>>: ').strip()
    if choice in dic:
        dic[choice]()

5.发生一个return,函数整体就结束(无法返回多个值)

def calc(x,y):   #x,y为形参
    res=x**y
    return x
print(res)   #报错

6.函数可嵌套

7.分类:

1.内置函数:可直接使用
2.:通过import导入库,然后使用其中定义的函数
3.第三方库函数:下载安装第三方库,通过import导入,然后使用其中定义的函数
4.用户自定义函数:用户根据需求自定义

二.函数和过程
1.过程:过程就是简单特殊没有返回值的函数

def test01():
    msg='hello The little green frog'
    print(msg)
 
def test02():
    msg='hello'
    print(msg)
    return msg
   
t1=test01()
t2=test02()

print('from test01 return is [%s]' %t1)   #结果为from test01 return is [None]
print('from test02 return is [%s]' %t2)   #结果为from test02 return is [hello]

2.返回none:当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,所以在python中即便是过程也可以算作函数

def test01():
    pass
 
def test02():
    return 0

def test03():
    return 0,10,'hello',['alex','lb'],{'WuDaLang':'lb'}
 
t1=test01()
t2=test02()
t3=test03()
 
print('from test01 return is [%s]: ' %type(t1),t1)
#结果为from test01 return is [<class 'NoneType'>]:  None
print('from test02 return is [%s]: ' %type(t2),t2)
#结果为[<class 'int'>]:  0
print('from test03 return is [%s]: ' %type(t3),t3)
#结果为[<class 'tuple'>]:  (0, 10, 'hello', ['alex', 'lb'], {'WuDaLang': 'lb'})

返回值数=0:返回None
返回值数=1:返回object
返回值数>1:返回tuple

三.函数参数
1.形参就是形式上的参数,可以理解为数学的X,没有实际的值,通过别人赋值后才有意义。相当于变量。形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

2.实参就是实际意义上的参数,是一个实际存在的参数,可以是字符串、数字等。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值、输入等办法使参数获得确定值

def calc(x,y):   #x,y为形参
    res=x**y
    return res

c=calc(a,b)   #a,b为实参
print(c)

3.位置参数和关键字
标准调用:实参与形参位置一一对应

def calc(x,y):  
    res=x**y
    return res

c=calc(1,2)   
print(c)

关键字调用:位置无需固定

def calc(x,y):   
    res=x**y
    return res

c=calc(y=2,x=1)   
print(c)

位置参数必须在关键字参数左边

4.默认参数:定义时赋值的参数(调用时可再次赋值覆盖原值)

  • 注意:每次调用使用默认参数都是内存中的同1个对象
>>> def func(arg,li=[]):
...     li.append(arg)
...     return li
...
>>> l1=func(1)
>>> l2=func(2,[])
>>> l3=func(3)
>>> l4=func(4)
>>> print(l1,l2,l3,l4)
[1, 3, 4] [2] [1, 3, 4] [1, 3, 4]
#因为每次调用函数,使用的默认参数都是同1个列表(即定义在func()中的li);只有第2次使用的是传入的列表

5.参数组:可变长度的参数
**表示字典(一般用kwargs),*表示列表/元组(一般用args)

def test(x,*args):
	print(x)
	print(args)
	print(args[2])	
test(1,2,3,4,5,6)   #运行结果为1   (2,3,4,5,6)     4
def test(x,*args):
	print(x)
	print(args)
test=(1,["x","y"])   #运行结果为1     (["x","y"])

def test(x,*args):
	print(x)
	print(args)
test=(1,星号["x","y"])   #运行结果为1     ("x","y")

def test(x,**kwargs):
	print(x)
	print(kwargs)
test=(1,y=2,z=3)   #运行结果为1    {"y":2,"z":3}

*args必须在[星号][星号]kwargs左边(否则位置参数会出现在关键字参数右边)
*args只接受位置参数/列表
**kwargs只接受关键字参数/字典

四.名称空间与作用域
1.名称空间:存放名字的地方(x=1,1存放于内存中,那变量名x存放在哪里呢?名称空间正是存放变量名x与1的绑定关系的地方)

2.名称空间的加载顺序:

python test.py
#1.python解释器先启动,因而首先加载的是:内置名称空间
#2.执行test.py文件,然后以文件为基础,加载全局名称空间
#3.在执行文件的过程中如果调用函数,则临时产生局部名称空间

3.名字查找顺序:局部名称空间–>全局名称空间–>内置名称空间

LEGB代表查找顺序:locals -> enclosing function -> globals -> __builtins__
locals是函数内的名字空间,包括局部变量和形参
enclosing:外部嵌套函数的名字空间(闭包中常见)
globals:全局变量,函数定义所在模块的名字空间
builtins:内置模块的名字空间

#注意:
1.在全局无法查看局部的,但在局部可以查看全局的:
max=1
def f1():
	max=2
	def f2():
	    max=3
	    print(max)
	f2()
f1()#结果:3
print(max)#结果:1
def f3():
	max=2
	def f4():
	    print(max)
	f4()
f3()#结果:2

2.作用域在函数执行之前(具体来说,是编译时)就已经被创建:
  #也就是说:函数的作用域不取决于函数在哪里执行,而取决于函数在哪里被定义
v=123
def foo():
    v=456
    def inner():
        print(v)
    return inner
result=foo()
result()#结果:456

五.局部变量与全局变量
1.作用域:作用域即范围
–全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
–局部范围(局部名称空间属于该范围):临时存活,局部有效

2.局部变量:在子程序中定义的变量称为局部变量,作用域是定义该变量的子程序
3.全局变量:在程序的一开始定义的变量称为全局变量,作用域是整个程序
4.当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用

name='lhf'   #全局变量

def change_name():
    print('我的名字',name)   #结果为:我的名字 lhf

def change_name():
    name='帅了一笔'   #局部变量
    print('我的名字',name)   #结果为:我的名字 帅了一笔  

change_name()
print(name)   #结果为:lhf

def change_name():
    global name
    name='帅了一笔'   #全局变量
    print('我的名字',name)   #结果为:我的名字 帅了一笔   

change_name()
print(name)   #结果为:帅了一笔

5.查看作用域:globals()/locals()

6.global
无global不可对全局变量重新赋值,但对(全局变量)可变对象可以对内部元素进行操作。优先读取局部变量
有global可给全局变量(最外层)赋值,之后使用/定义的为全局变量(一个指针,引用全局中真实的值,子程序中只有一个地址)
有nonlocal可给上一层变量赋值,之后使用/定义的为上一级变量

规范:全局变量大写,局部变量小写

name="a"

def wh():
    name="b"
    def wwh():
        global name
        name="c"
    wwh()
    print(name)

print(name)
wh()
print(name)   #结果为a   b   c

作用域在定义函数时就已经固定,不随调用位置的改变而改变:

#coding=gbk
name = "Alex"
 
def change_name():
    name = "Alex2"
 
    def change_name2():
        name = "Alex3"
        print("第3层打印",name)
 
change_name2() #调用内层函数
print("第2层打印",name)
def foo():
    name='lhf'
    def bar():
        print(name)
    return bar

func=foo()
func()   #结果为lhf
name='alex'

def foo():
    name='lhf'
    def bar():
        name='wupeiqi'
        def tt():
            print(name)
        return tt
    return bar

func=foo()
func()()   #结果为wupeiqi

六.前向引用之’函数即变量’:所有函数必须在调用之前定义

def action():
    print('in the action')
    logger()
action()   #报错NameError: global name 'logger' is not defined

def logger():
    print('in the logger')
def action():
    print('in the action')
    logger() 
action()   #不报错,结果为in the logger     in th action
 
def action():
    print('in the action')
    logger()
def logger():
    print('in the logger') 
action()   #不报错,结果为in the logger     in th action

def action():
    print('in the action')
    logger()
action()
def logger():
    print('in the logger')   #报错NameError: global name 'logger' is not defined 

七.递归调用
1.递归函数:如果一个函数在内部直接或间接调用自身本身,这个函数就是递归函数

def calc(n):
    print(n)
    calc(n)   #calc(n)即为一个递归函数
def calc(n):
    print(n)
    if int(n/2) ==0:
        return n
    return calc(int(n/2)) 
calc(10) 
print(calc(10))   #结果为10 5 2 1 10 5 2 1 1
import time

person_list=['alex','wupeiqi','yuanhao','linhaifeng']
def ask_way(person_list):
    print('-'*60)
    if len(person_list) == 0:
        return '没人知道'
    person=person_list.pop(0)
    if person == 'linhaifeng':
        return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
    print('hi 美男[%s],敢问路在何方' %person)
    print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' %(person,person_list))
    time.sleep(3)
    res=ask_way(person_list)
    # print('%s问的结果是: %res' %(person,res))
    return res

res=ask_way(person_list)
print(res)

2.特性:
必须有一个明确的结束条件
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
递归效率不高,递归层次过多会导致栈溢出
(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,当进入一个函数调用,栈会加一层栈帧;当函数返回,栈会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多会导致栈溢出)

堆栈扫盲:cnblogs.com/lln7777/archive/2012/03/14/2396164.html
尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
  
def binary_search(dataset,find_num):
    print(dataset)
 
    if len(dataset) >1:
        mid = int(len(dataset)/2)
        if dataset[mid] == find_num:  #find it
            print("找到数字",dataset[mid])
        elif dataset[mid] > find_num :# 找的数在mid左面
            print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:# 找的数在mid右面
            print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
            return binary_search(dataset[mid+1:],find_num)
    else:
        if dataset[0] == find_num:  #find it
            print("找到数字啦",dataset[0])
        else:
            print("没的分了,要找的数字[%s]不在列表里" % find_num)
 
 
binary_search(data,66)

八.匿名函数(lambda)
1.定义:
lambda 形参:返回值

lambda x:x+1       =        def calc(x): 
                                          return x+1
func=lambda x:x+1                                          
func(10)(调用)
print(func(10))

f=lambda x,y,z:(x+1,y+1,z+1)   #必须加()

2.注意:
如果不赋给一个函数名(一般不做),使用过一次后立即从内存中释放
无法有if之类的复杂逻辑,只能一行结束;":"后一定是return的结果
匿名函数主要是和其它函数搭配使用

l=[3,2,100,999,213,1111,31121,333]
print(max(l))

dic={'k1':10,'k2':100,'k3':30}
print(max(dic))

print(dic[max(dic,key=lambda k:dic[k])])
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)   #结果为1 25 49 16 64

九.函数式编程:
1.把程序的执行当做一串首尾相连的函数,一个函数输出的结果输入给另外一个函数,不断进行(一种编程风格)

2.函数式=编程语言定义的函数+数学意义的函数
函数式就是用编程语言去实现数学函数

特点:参数/返回值是函数(第一类对象);无for/while循环,所有循环由递归实现;无变量的赋值(即不用变量去保持状态)(不可变数据,函数内无赋值操作),无赋值即不改变;尾调用优化(尾递归)

3.尾调用:在函数的最后一步(不一定是最后一行)调用另外一个函数
return f 表示调用函数;return f() 表示调用函数并返回f()的return值

def bar(n):
    return n
def foo(x):
    return bar(x)+1   #bar在foo内不为尾调用
def bar1(n) :
    return n
def bar2(n):
    return n+1
def foo(x):
    if type(x) is str:
        return bar1(x)    
    elif type(x) is int:
        return bar2(x)    #bar1,bar2在foo内均为尾调用
def bar(n):
    return n
def foo(x):    
    y=bar(x)
    return y   #bar在foo内不为尾调用

尾调用优化:尾调用是函数的最后一步操作,无需保留外层函数调用记录,因调用位置、内部变量等信息不会再使用,只要直接用内层函数调用记录取代外层函数调用记录即可

4.高阶函数
满足两个特性之一:
函数的传入参数是一个函数名
函数的返回值是一个函数名

5.map函数:对每个元素进行指定运算

array=[1,3,4,71,2]

ret=[]
for i in array:
    ret.append(i**2)
print(ret)

#如果我们有一万个列表,那么你只能把上面的逻辑定义成函数
def map_test(array):
    ret=[]
    for i in array:
        ret.append(i**2)
    return ret

print(map_test(array))

#如果我们的需求变了,不是把列表中每个元素都平方,还有加1,减一,那么可以这样
def add_num(x):
    return x+1
def map_test(func,array):
    ret=[]
    for i in array:
        ret.append(func(i))
    return ret

print(map_test(add_num,array))
#可以使用匿名函数
print(map_test(lambda x:x-1,array))

#上面就是map函数的功能,map得到的结果是可迭代对象(显示其内存地址)(迭代器,只等迭代一次)
print(map(lambda x:x-1,range(5)))

6.reduce函数:把序列按指定方式进行合并操作

from functools import reduce
#合并,得一个合并的结果
array_test=[1,2,3,4,5,6,7]
array=range(100)

#报错,res没有指定初始值
def reduce_test(func,array):
    l=list(array)
    for i in l:
        res=func(res,i)
    return res

#print(reduce_test(lambda x,y,array))

#可以从列表左边弹出第一个值
def reduce_test(func,array):
    l=list(array)
    res=l.pop(0)
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))

#我们应该支持用户自己传入初始值
def reduce_test(func,array,init=None):
    l=list(array)
    if init is None:
        res=l.pop(0)
    else:
        res=init
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))
print(reduce_test(lambda x,y:x+y,array,50))

reduce在python3的内建函数被移除了,放入了functools模块

7.filter函数:遍历序列中每个元素,判断每个元素得到的布尔值,如果是True就留下

#电影院聚集了一群看电影bb的傻逼,让我们找出他们
movie_people=['alex','wupeiqi','yuanhao','sb_alex','sb_wupeiqi','sb_yuanhao']

def tell_sb(x):
    return x.startswith('sb')

def filter_test(func,array):
    ret=[]
    for i in array:
        if func(i):
            ret.append(i)
    return ret

print(filter_test(tell_sb,movie_people))

#函数filter,返回可迭代对象
print(filter(lambda x:x.startswith('sb'),movie_people))
#当然了,map,filter,reduce,可以处理所有数据类型

name_dic=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':9000},
    {'name':'linhaifeng','age':18},
]
#利用filter过滤掉千年王八,万年龟,还有一个九千岁
def func(x):
    age_list=[1000,10000,9000]
    return x['age'] not in age_list

res=filter(func,name_dic)
for i in res:
    print(i)

res=filter(lambda x:x['age'] == 18,name_dic)
for i in res:
    print(i)

#reduce用来计算1到100的和
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),100))
print(reduce(lambda x,y:x+y,range(1,101)))

#用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao']

res=map(lambda x:x+'_sb',name)
for i in res:
    print(i)

十.内置函数:https://www.runoob.com/python/python-built-in-functions.html

1.abs(num):取绝对值

2.all(str/list/tuple/dict/set):判断给定的可迭代参数 iterable 中的所有元素是否都为 True(空元组/列表/集合返回值为True;str/dict总为True)

3.any(str/list/tuple/dict/set):每个元素进行布尔运算,是否有True(空~为False;dict/str只要不为空,均为True)

4.ascii(str/list/tuple/dict/set/num):返回一个表示对象的str,

  • 类似 repr() 函数,但是对非ASCII字符则返回通过repr()函数使用\x,\u,\U编码的字符
  • 生成字符串类似 Python2 版本中 repr() 函数的返回值

5.basestring():str 和 unicode 的超类(父类),也是抽象类,因此不能被调用和实例化,但可以被用来判断一个对象是否为 str 或者 unicode 的实例,isinstance(obj, basestring) 等价于 isinstance(obj, (str, unicode))

isinstance("Hello world", str)
True
 isinstance("Hello world", basestring)
True

6.bin(int):将10进制转成2进制

7.bool():进行布尔运算,判断为True/False

8.bytearray([source[, encoding[, errors]]]):返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256
参数:
如果 source 为整数,则返回一个长度为 source 的初始化数组;
如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
如果没有输入任何参数,默认就是初始化数组为0个元素

9.bytes(str,encoding=“编码方式”):返回输入的字符串按照选定的方式编码出的二进制数(不可使用unicode)
可加.decode(“解码方式”):解码出信息(有默认方式,python3为uft-8)

10.callable(object):用于检查一个对象是否是可调用的
如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功

11.chr(int):返回ASCII表该参数位置的字符

12.classmethod:修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等

#!/usr/bin/python
#coding=utf-8 
class A(object):
    bar = 1
    def func1(self):  
        print ('foo') 
    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

#结果为fun2   1   foo

13.cmp(x,y):函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1

14.compile(source, filename, mode[, flags[, dont_inherit]]):将一个字符串编译为字节代码
参数:
source – 字符串或者AST(Abstract Syntax Trees)对象。。
filename – 代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。
mode – 指定编译代码的种类。可以指定为 exec, eval, single。
flags – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。。
flags和dont_inherit是用来控制编译源码时的标志

str = "for i in range(0,10): print(i)" 
c = compile(str,'','exec')   # 编译为字节代码对象 
c
<code object <module> at 0x10141e0b0, file "", line 1>
 exec(c)
0
1
2
3
4
5
6
7
8
9
str = "3 * 4 + 5"
a = compile(str,'','eval')
eval(a)
17

15.complex([real[, imag]]):用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数

complex(1, 2)
(1 + 2j)
 
 complex(1)    # 数字
(1 + 0j)
 
 complex("1")  # 当做字符串处理
(1 + 0j)
 
#"+"两侧不得有空格。否则报错
complex("1+2j")
(1 + 2j)

16.delattr(x,y):删除对象x中的y属性
delattr(x,y)相当于del x.y

17.dict(**kwarg/mapping, **kwarg/iterable, **kwarg):转换成字典
参数说明:
**kwargs – 关键字
mapping – 元素的容器。
iterable – 可迭代对象

dict()                        # 创建空字典
{}
dict(a='a', b='b', t='t')     # 传入关键字
{'a': 'a', 'b': 'b', 't': 't'}
dict(zip(['one', 'two', 'three'], [1, 2, 3]))   # 映射函数方式来构造字典
{'three': 3, 'two': 2, 'one': 1} 
dict([('one', 1), ('two', 2), ('three', 3)])    # 可迭代对象方式来构造字典
{'three': 3, 'two': 2, 'one': 1}

18.dir( /object):不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息

19.divmod(x,y):以元组形式显示x/y的商和余数
在 python 2.3 版本之前不允许处理复数
分页功能

20.enumerate(sequence, [start=0]):用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
Python 2.3. 以上版本可用,2.6 添加 start 参数

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
 list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
 list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

21.eval(str, globals, locals):执行一个字符串表达式,并返回表达式的值(提取字符串中字典/进行字符串中的数学运算)(不支持函数变量/类变量)
参数说明:
globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象

22.exec(str/file):执行储存在str/file中的Python语句,比之eval()可以执行更复杂的 Python 代码

Python2中exec是一个内置语句(statement)而非函数,但Python2有一个execfile()函数。可理解为Python3把exec这个statement和execfile()函数整合到了一个新的exec()函数中

#单行语句字符串
exec('print("hello world")')
#Hello World
 
#多行语句字符串
exec('for i in range(5):print("iter time: %d" % i)')
#iter time: 0
#iter time: 1
#iter time: 2
#iter time: 3
#iter time: 4

#内外两层引号不得相同,必须一个只包含单引号,一个只包含双引号

23.execfile(filename[, globals[, locals]]):用来执行一个文件

文件hello.py,内容如下:

print('runoob')
execfile('hello.py')
runoob

24.file(name,mode,buffering):用于创建一个 file 对象,它有一个别名叫 open(),更形象一些,它们是内置函数

参数说明:以str的形式传递
name – 文件名
mode – 打开模式
buffering – 0 表示不缓冲,如果为 1 表示进行行缓冲,大于 1 为缓冲区大小

文件 test.txt,内容如下:

RUNOOB1
RUNOOB2
f = file('test.txt')
 f.read()
'RUNOOB1\nRUNOOB2\n'

25.filter(function, iterable):用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中

26.float(int/str):转换成浮点数

27.format():格式化字符串,详情参见字符串部分
Python2.6 开始增加
format 函数可以接受不限个参数,位置可以不按顺序

28.frozenset(iterable):返回一个冻结的集合,冻结后集合不能再添加或删除任何元素(如果不提供任何参数,默认会生成空集合)

29.getattr(object,name,default=None):获得object中name字符串对应的方法的地址/数据属性的值
不存在时返回default参数,默认为None时直接报错
所有参数均为位置参数
getattr(x,‘y’)相当于x.y

30.globals():以字典类型返回所有全局变量

31.hasattr(object,name):判断object中是否有name字符串对应的方法/属性(实际为是否能调用name方法/属性)

32.hash(num/str/tuple):进行哈希运算,返回哈希值
hashable的类型即不可变类型
哈希值长度固定;无法根据哈希值反推输入的信息具体是什么;同一次执行,同意输入得到相同哈希值;不同次执行,同样输入哈希值不一定相同
可用于判断信息是否被篡改

33.help(object):查看帮助

34.hex(int):10进制转16进制,以字符串形式表示

35.id(object):获取对象的唯一标识符(1个int)

  • CPython中id()用于获取对象的内存地址

36.input(prompt):Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。

raw_input() 将所有输入作为字符串看待,返回字符串类型。而 input() 在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float );raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError

参数说明:prompt: 提示信息

37.int(str/num,base=10):将指定进制的str/num转换成10进制整型

不传入参数时,得到结果0;如果是带参数base的话,要以字符串的形式进行输入num

38.isinstance(object,classinfo):判断是否是指定类型

会认为子类是一种父类类型,考虑继承关系
与type()区别:

class A:
    pass
 
class B(A):
    pass
 
isinstance(A(), A)    # returns True
type(A()) == A        # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

参数说明:classinfo – 可以是直接或间接类名、基本类型或者由它们组成的元组

39.insubclass(class, classinfo):判断参数 class 是否是类型参数 classinfo 的子类

40.iter(object,sentinel):生成迭代器
参数说明:
object–支持迭代的集合对象
sentinel–如果传递了第二个参数,则object必须是一个可调用的对象(如函数);此时iter创建了一个迭代器对象,每次调用该迭代器对象的__next__()方法时,都会调用object;直到返回结果为sentinel时raise StopIteration

lst = [1, 2, 3]
 for i in iter(lst):
...     print(i)
... 
1
2
3

41.len():返回长度/项目个数

42.list():转换成列表

43.locals():以字典形式返回所有当前级别局部变量
对于函数, 方法, lambda 函式, 类, 以及实现了 call 方法的类实例, 它都返回 True

44.long(x, base=10):将数字或字符串转换为一个长整型
只适用于python2

45.map(function, iterable):根据函数对指定序列做映射
function以每个参数序列中的每个对应元素调用function,返回包含每次function函数返回值的新列表(python2)/迭代器(python3)

map(function,iterable1,iterable2...)
#参数说明:
#function:函数
#iterable:序列(list,tuple,str...)

def square(x) :            
...     return x ** 2
map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
 
#提供了两个列表,对相同位置的列表数据进行加和
 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

def a(a1,a2,a3):
    a1*=2
    return a1,a2,a3
list(map(a,('a','aa','aaa'),'aa','aaa'))
#结果:[('aa', 'a', 'a'),('aaaa','a','a')]
#参数3,4被作为序列使用

46.max(x,y…,key=none):按照指定的方法key比较大小,返回给定参数的最大值

  • 参数可为序列(依靠for循环)
  • 对int/float/bool,比较大小;对字符串,逐个字符比较,规则来自ASCII码表(b>a);complex无法比较;对tuple/list,逐个比较其中元素,如对应元素均相同,元素多的较大;dict无法比较;set也可比较;对键值对,比较的是key
  • 只能同类比较
>>> a=[-1,0]
>>> b=[-2,0,-1]
>>> max(a,b)
[-1, 0]
>>> b=[-1,0,-2]
>>> max(a,b)
[-1, 0, -2]
>>> a=[0,1]
>>> b=[1,-10]
>>> max(a,b)
[1, -10]

47.memoryview(object):返回给定参数的内存查看对象(Momory view,返回给定参数的内存查看对象(Momory view))
python2:

v = memoryview('abcefg')
v[1]
'b'
 v[-1]
'g'
 v[1:4]
<memory at 0x77ab28>
v[1:4].tobytes()
'bce'

python3:

v = memoryview(bytearray("abcefg", 'utf-8'))
print(v[1])
98
print(v[-1])
103
print(v[1:4])
<memory at 0x10f543a08>
print(v[1:4].tobytes())
b'bce'

48.min(x,y…):返回给定参数的最小值,参数可以为序列

49.next(iterator[, default]):返回迭代器的下一个项目(调用_next_())
参数说明:
iterator – 可迭代对象
default – 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常

#!/usr/bin/python
#coding=UTF-8 
#首先获得Iterator对象
it = iter([1, 2, 3, 4, 5])
#循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break     #结果为1  2  3  4  5

50.object():?

51.oct(int):10进制转8进制

52.open(“name”, “mode”, buffering,encoding=" "):打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写

参数说明:
name:一个包含文件名的字符串值(绝对/相对路径)
mode:打开文件的模式,只读,写入,追加等;所有可取值见如下的列表;可选,默认为只读®
buffering:即输入多少数据时写入;如果为0,就没有寄存;如果取1,访问文件时会寄存行;如果设为大于1的整数,表明寄存区缓冲大小;如果取负值,寄存区缓冲大小为系统默认
encoding:编码方式,默认使用当前系统的编码方式解码
在这里插入图片描述
在这里插入图片描述
x:只写模式,不可读,不存在则创建,存在则报错
x+:可读写的x模式
xb:以二进制格式打开的x模式
b模式不进行解码,不指定编码方式
在这里插入图片描述
53.ord(str): chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常

54.pow():返回 x**y的值
语法:
math 模块 pow() 方法的语法:

import math
math.pow( x, y )

内置的 pow() 方法:

pow(x, y[, z])   #等效于pow(x,y) %z

内置方法会把参数作为整型,而 math 模块则会把参数转换为 float

55.print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False):用于打印输出

参数说明:
objects – 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep – 用来间隔多个对象,默认值是一个空格。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file – 要写入的文件对象。
flush – 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新,仅python3。

print 在 Python3.x 是一个函数,但在 Python2.x 版本不是一个函数,只是一个关键字

56.property([fget[, fset[, fdel[, doc]]]]):在新式类中返回属性值
参数说明:
fget – 获取属性值的函数
fset – 设置属性值的函数
fdel – 删除属性值函数
doc – 属性描述信息

定义一个可控属性值x:

class C(object):
    def __init__(self):
        self._x = None
 
    def getx(self):
        return self._x
 
    def setx(self, value):
        self._x = value
 
    def delx(self):
        del self._x
 
    x = property(getx, setx, delx, "I'm the 'x' property.")

如果 c 是 C 的实例化, c.x 将触发 getter,c.x = value 将触发 setter , del c.x 触发 deleter。
如果给定 doc 参数,其将成为这个属性值的 docstring,否则 property 函数就会复制 fget 函数的 docstring(如果有的话)。

将 property 函数用作装饰器可以很方便的创建只读属性:

class Parrot(object):
    def __init__(self):
        self._voltage = 100000
 
    @property
    def voltage(self):
        """Get the current voltage."""
        return self._voltage

上面的代码将 voltage() 方法转化成同名只读属性的 getter 方法。

property 的 getter,setter 和 deleter 方法同样可以用作装饰器:

class C(object):
    def __init__(self):
        self._x = None
 
    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x
 
    @x.setter
    def x(self, value):
        self._x = value
 
    @x.deleter
    def x(self):
        del self._x

这个代码和第一个例子完全相同,但要注意这些额外函数的名字和 property 下的一样,例如这里的 x

57.raw_input(prompt):获取控制台的输入

58.reduce(function, iterable[, initializer]):对参数序列中元素进行累积(用传给 reduce 中的函数 function(有两个参数)对集合中的元素依次进行操作)
参数说明:
initializer:初始参数

print(reduce(lambda x, y: x+y, [1,2,3,4,5]))
#15

59.reload(module):重新载入之前载入的模块

60.repr(object):将对象转化为供解释器读取的形式

61.reversed():反向列表中元素,返回迭代器对象

a=reversed(li)

a=[1,4,532,2]
b=reversed(a)
print(b)
#结果:
<list_reverseiterator object at 0x000001E4AF66CF08>

62.round( x [, n]):返回浮点数x的四舍五入值
参数说明:n:保留的小数点后位数(如为负数,指小数点前位数,但仍显示到小数点后一位)

63.set(iterable):创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等

x=set("google")={"g","o","l","e"}

64.setattr(x,y,v):给对象x增加一个y=v的属性/将对象x的y属性的值修改为v

class a:
    def __init__(self,name):
        self.name=name

a1=a('qaz')        
setattr(a,'func',lambda self:self.name+'ed')
print(a.func(a1))   #qazed

65.slice(start=0, stop, step=1):实现切片对象,主要用在切片操作函数里的参数传递

s=slice(3,5)
print("hello"[s])

66.sorted(iterable, cmp=None, key=None, reverse=False):对所有可迭代的对象进行排序操作
sort与sorted区别:sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

参数说明:
iterable – 可迭代对象。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

不同类型不能排序

67.staticmethod(function):返回函数的静态方法(不强制要求传递参数)

68.str(object):转换为字符串

69.sum(iterable, start=0):对系列进行求和计算
参数说明:start:额外指定的相加的参数

70.super(type[, object-or-type]):用于调用父类(超类)的一个方法。super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
参数说明:
type – 类。
object-or-type – 类,一般是 self

Python 3 可直接使用 super().xxx 代替 super(Class, self).xxx; python2不可
python3实例:

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

python2实例:

#!/usr/bin/python
#coding=UTF-8
class A(object):   # Python2.x 记得继承 object
    def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super(B, self).add(x)
b = B()
b.add(2)  # 3

71.tuple(seq):将序列转换成元组

72.type(name, bases, dict):如果只有第一个参数则返回对象的类型(是哪个类的实例),三个参数返回新的类型对象
参数说明:
name – 类的名称
bases – 基类的元组
dict – 字典,类内定义的命名空间变量

不会认为子类是一种父类类型,不考虑继承关系

class foo:
    pass
class bar(foo):
    pass
b1=bar()
print(type(b1))   #<class '__main__.bar'>

print(type('X', (object,), dict(a=1)))
#<class '__main__.X'>
#相当于:
#class X(object):
#    a=1

与isinstance()区别:

class A:
    pass
 
class B(A):
    pass
 
isinstance(A(), A)    # returns True
type(A()) == A        # returns True
isinstance(B(), A)    # returns True
type(B()) == A        # returns False

73.unichr(i):和 chr()函数功能基本一样, 但返回 unicode 的字符
参数说明:i–可以是10进制也可以是16进制的形式的数字

74.unicode():?

75.vars(object=none):无参数,等于locals();有参数,以字典形式返回对象object的属性和属性值的字典对象

76.xrange(start=0,stop,step=1):用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器

77.zip(iterable1,interable2):将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表

  • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同(多余的元素直接忽略)
  • 利用*号操作符,可以返回传入的可迭代对象构成的列表(不论传入何种,列表中元素均为元组;可理解为解压)
  • 在 Python 3.x 中为了减少内存,zip() 返回的是一个对象;如需展示列表,需手动 list() 转换
zip(iterable1,iterable2...)#最少有一个可迭代对象

>>> list(zip(('a','b','c')))
[('a',), ('b',), ('c',)]
>>>list(zip(("a","b","c"),(1,2,3))
[("a",1),("b",2),("c",3)]
>>>dict={"name":"Alex","age":18,"gender":"male"}
>>>list(zip(dict.keys(),dict.values()))
[("gender","male"),("name","Alex"),("age",18)]

>>> zipped=list(zip([1,2,3],['2','d',3]))
>>> zipped
[(1, '2'), (2, 'd'), (3, 3)]
>>> list(zip(*zipped))
[(1, 2, 3), ('2', 'd', 3)]

使用zip()并行迭代:通过zip()对多个序列进行并行迭代

  • zip()在最短的序列用完时就停止
name=('a','b','c','d'),age=(20,30,17,23),job=('老师','研究员','程序员')
for name,age,job in zip(name,age,job):
    print('{0}-{1}-{2}'.format(name,age,job))
#结果:    
a-20-老师
b-30-研究员
c-17-程序员

78._ import_(name[, globals[, locals[, fromlist[, level]]]]):用于动态加载类和函数(如果一个模块经常变化就可以使用 _ import_() 来动态载入)

  • 导入字符串类型模块名

79.import:导入模块

import 文件名(无后缀)
文件名.其中要调用的功能   #调用

as:指代

import time as T
#之后可使用T指代time模块

80.字典的运算:最小值,最大值,排序

salaries={'egon':3000,'alex':100000000,'wupeiqi':10000,'yuanhao':2000}

迭代字典,取得是key,因而比较的是key的最大和最小值

max(salaries)
'yuanhao'
min(salaries)
'alex'

可以取values,来比较

max(salaries.values())
min(salaries.values())
但通常我们都是想取出,工资最高的那个人名,即比较的是salaries的值,得到的是键
max(salaries,key=lambda k:salary[k])
'alex'
min(salaries,key=lambda k:salary[k])
'yuanhao'

也可以通过zip的方式实现

salaries_and_names=zip(salaries.values(),salaries.keys()) 

先比较值,值相同则比较键

max(salaries_and_names)
(100000000, 'alex')

salaries_and_names是迭代器,因而只能访问一次

min(salaries_and_names)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: min() arg is an empty sequence
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值