函数拓展及表达式

Posted cpsyche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数拓展及表达式相关的知识,希望对你有一定的参考价值。

一.函数的递归

递归(recursion):在函数内部自己调用自己。

递归分为两个阶段:回溯和递推。

 

回溯:回溯一次,问题的复杂度就会进一步降低,直到终止条件成立,结束。

递推:从终止条件成立时,一次次的往回推导

技术图片
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]

def get_num(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_num(i)

get_num(l)
View Code

 

pycharm导入import sys模块,通过sys.getrecursionlimit()方法,知道递归的层数默认值为1000,但是实际上只有997(从0开始)。

可以通过sys.setrecursionlimit()方法,指定递归层数。

 

两种代替代码块的方式:

  第一种顶替方式 pass (推荐使用pass)
  第二种顶替方式 ... 

二.二分法

应用场景:在一个有序的容器内查找某个值

查找方法:每次查找都从中间开始进行比较。

技术图片
l = [1,2,3,4,5,6,7,8,9,10]
count =0
target= 5
def find_two (li,target) :
    global count
    print(count)
    print(li)
    count += 1
    print(len(li)//2)
    middle = len(li) //2

    if target < li[middle] :
        left = li [0:middle]
        find_two(left,target)
    elif target < li[middle] :
        right = li [middle+1:]
        print(right)
        find_two(right, target)
    elif li[middle] == target:
        print("find",count)

find_two(l,target)
View Code

 

三.三元表达式

a if a > b  else b

如果if后面的条件 成立返回前面的值,否则返回else后面的值

应用场景:在只有两种情况的条件下

四.生成式

1.列表生成式

 格式:[变量名 for 变量名  in 容器类型 if 判断条件]

技术图片
l = [tank,nick,oscar,sean]

res = ["%s_rich" %i for i in l if i.endswith(k)]
print(res)
View Code

 

2.字典生成式

  格式:key: value for key: value  in 容器类型 if 判断条件

技术图片
l1 = [jason,18,dbj]
res= i:j for i,j in enumerate(l1) if j != 18
print(res)
View Code

 

3.集合生成式

 格式:变量名 for 变量名  in 容器类型 if 判断条件

print(i for i in range(10) if i != 9)

 

4.生成器表达式

 格式:(变量名 for 变量名  in 容器类型 if 判断条件)

 

五.匿名函数简介

匿名函数:没有名字的函数,只能临时使用一次,用完地址就销毁。

 lamba 函数参数 : 函数返回值

max(dic,key=lambda k:dic[k])

ps :匿名函数通常会配合其他函数使用。

六.常用内置函数

map(func, *iterables)映射函数

技术图片
l = [1,2,3,4,5]

print(list(map(lambda y:y+10,l)))  #  容器类型的每一个元素调用前面的函数,并把返回值生成一个新的列表。
View Code

zip([iterable, ...]) 压缩函数

技术图片
l1 = [1,2,]
l2 = [jason,egon,tank]
l3 = [a,b,c]
zipper = list(zip(l1,l2,l3)) 
# 可以把多了容器类型中的对应的元素,以元祖的形式储存在列表中。返回值是个地址
#列表的长度取决于,容器类型中最短的那个。可以用list把zip对象转换成列表
print(zipper)
print(list(zip(*zipper)))
#可以用*把zip过程逆转
View Code

filter(function, iterable) 过滤函数

技术图片
l = [1,2,3,4,5,6]
print(list(filter(lambda y:y != 10,l)))
# 通过条件过滤掉不想要的元素,然后生成一个新的列表
View Code

sorted(iterable, reverse = bool ):

技术图片
l = [1,2,3,4,5,6]

print(sorted(l,reverse=True)) #降序
print(sorted(l,reverse=False)) #升序
View Code

reduce(function, iterable, initia=None)

使用reduce函数需要from functools import reduce 导入函数

技术图片
from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))
#匿名函数获取容器中的前两个值,如果容器非空的话就把初始值放在容器中的第一个
#然后再取出后面一个值,与和相加,直到拿到所有;列表加默认值之he。
View Code

 

以上是关于函数拓展及表达式的主要内容,如果未能解决你的问题,请参考以下文章

QT入门-信号槽拓展

ES6里关于正则表达式的拓展

python五十九课——正则表达式的拓展内容

ES6标准入门之正则表达式的拓展

对象拓展

如何用正则表达式在JS中匹配出相应的拓展名?