13-函数3

目录:匿名函数,内置函数,递归调用

匿名函数

 

lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方,执行完就会被回收

常规版本:

def fun(x,y):
    return x*y

lambda版本:

f=lambda x,y:x*y
print(f(2,6))

示例:

salaries={‘egon‘:5000,‘alex‘:100000,‘wupeiqi‘:10000,‘yuanhao‘:2000}
要求:找出工资最高的人的名字
def func(k):
    return salaies[k]
print(max(salaies, key=func))
或
print(max(salaies, key=lambda k:salaries[k]))

要求按照工资大小进行排序:
print(sorted(salaries, key=lambda x:salaries[x])) #默认从小到大
print(sorted(salaries, key=lambda x:salaries[x], reverse=True)) # 从大到小

内置函数:

1,数学运算

abs(),round(),pow(),divmod(),max(),min(),sum()

abs(-1): 绝对值,结果是1

round(3.1415926, 4): 四舍五入,4为保留位数,结果是3.1416

pow(2,3,5): 2表示底数,3表示指数,5表示取模,2^3 % 5 = 余数为3

divmod(9, 2): 9表示被除数,2表示除数,结果是元组形式的商合余数:(4,1)

max(1,2,10,100,98,20): 求最大值

min(1,2,10,100,98,20): 求最小值

sum(2,-5,9,12): 求和

2,工厂函数

int(),float(),str(),bool(),slice(),list(),tuple(),dict(),set(),frozenset()

int(‘5‘): 转换为整数integer

float(2): 转换为浮点数float

str(2.3): 转换为字符串string

bool(0): 转换为布尔值,结果是真还是假,0,‘‘,[],{},(),None均为False

slice(2,6,9):

list(1,2,3): 转换为列表list

tuple([1,2,3]): 转换为元组

dict(a=1,b=‘hello‘,c=[1,2,3]): 转换为字典dict

set(): 转换为集合

forzenset(): 创建不可修改的集合

3,类型类型转换

ord(),chr(),bin(),hex(),oct(),complex()

print(ord(D)):将字母转换为ASCII码表上对应的数字

print(chr(9)):将数字转换为ASCII码表上对应的字母

print(hex(17)):转换为十六进制

print(bin(5)):转换为二进制

print(oct(2)):转换为八进制

#复数,有实部和虚部(不常用)

res=complex(2+8j)

print(res.real)

print(res.imag)

4,序列操作

all(),any(),sorted(),reversed()

all([1,2,3]): 判断是否为True,全部为真,才为真,有一个为假,则为假

any(0,1,None,3):判断是否为真,只要有一个为真,就为真,如果全部为假,则为假

sorted([1,3,2]):从小到大排序

sorted([1,3,2].reverse=True):从大到小排序

reversed(1,3,2):从大到小排序

5,编译执行函数

repr(),compile(),eval(),exec()

repr():返回对象me的字符串表示

print(type(repr(me)))

1,str

compile():解释字符串表达式,参数也可以是compile()返回的code对象

print(compile(‘hello‘, ‘test.py‘))

<code object <module> at 0x0000000000A33540, file "test.py", line 1>

eval():

cmd = ‘print("你瞅啥")‘

eval(cmd)  #可将字符串中的命令执行出来

运行结果:

你瞅啥

exec():

exec("print(‘hello‘)")

执行字符串或complie方法编译过的字符串,没有返回值

6,帮助函数

dir(),help(),id(),len(),challables()

v = []

print(dir(v)) # 查看v下面的属性

print(help(v)) # 查看该对象的帮助文档

print(id(v)) # 查看该对象的内存空间地址

print(len(v)) # 返回该对象的长度

print(challables(v)) # 判断该对象是否可被调用,能被调用就是一个challables对象,比如函数和带有__call__的实例

7,作用域查看

globals() #返回一个描述当前全局变量的字典

locals() #打印当前可用的局部变量的字典

vars() #当函数不接收参数时,其功能和locals函数一样,返回当前作用域内的局部变量;

#当接收一个参数时,参数可以是模块,类,类实例,或者定义了__dict__属性的对象

8,迭代器函数

iter(),next(),enumerate(),range()

iter(o[, sentinel])

返回一个iterator对象。该函数对于第一个参数的解析依赖于第二个参数。如果没有提供第二个参数,参数o必须是一个集合对象,支持遍历功能(__iter__()方法)或支持序列功能(__getitem__()方法),参数为整数,从零开始。如果不支持这两种功能,将处罚TypeError异常。如果提供了第二个参数,参数o必须是一个可调用对象。在这种情况下创建一个iterator对象,每次调用iterator的next()方法来无参数的调用o,如果返回值等于参数sentinel,触发StopIteration异常,否则将返回该值。

next():返回一个可迭代数据结构中的下一项

enumerate(): 返回一个可以枚举的对象,该对象的next()方法将返回一个元组

x = range(10)

enumerate([1,2,3]).__next__()

range():根据需要生成一个指定范围的数字,可以提供你需要的控制来迭代指定的次数

9,其他

hash(),filter(),format(),input(),open(),print(),zip(),map(),__import__

hash():哈希值用于快递比价字典的键。

1. 只要校验的内容一致,那hash得到结果永远一样

2. 不可逆

3. 只要采用的哈希算法一样,那无论被校验的内容有多长,hash的到的结果长度都一样

print(hash(‘sjfoiqwwrf‘))

print(hash(‘sjfoiqwwrf‘))

运行结果:

-6140230450656353267

-6140230450656353267

filter():过滤器

和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素

例如:

l=[‘alex_sb‘, ‘wupeiqi_sb‘, ‘yuanhao_sb‘,‘egon‘]

res=filter(lambda x:x.endswith(‘sb‘), l)

print(res)

print(list(res))

运行结果:

[‘alex_sb‘, ‘wupeiqi_sb‘, ‘yuanhao_sb‘]

format():#格式化输出字符串,format(value, format_spec)实质上是调用了value的__format__(format_spec)方法

‘‘‘

"I am {0}, I like {1}!".format("wang", "moon")

"I am {}, I like {}!".format("wang", "moon")

"I am {name}, I like {msg}!".format(name = "wang", msg ="moon")

‘‘‘

input():#获取用户输入内容

open():打开文件

print():输出函数

zip():拉链函数

zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素按顺序组合成一个tuple,每个tuple中包含的是原有序列中对应序号位置的元素,然后返回由这些tuples组成的list。若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同。在所有参数长度相同的情况下,zip()与map()类似,没有参数的情况下zip()返回一个空list

x = [1, 2, 3]

y = [4, 5, 6]

z = [7, 8, 9]

xyz=zip(x,y,z)

print(list(zip(*xyz)))

运行结果:

[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

运行机制:

在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))

所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

map(function, iterable,...)

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回,不会改变原数

例如:

为每个元素加一个‘sb‘字符串

l=[‘alex‘,‘wupeiqi‘,‘yuanhao‘]

res=map(lambda x:x+‘_sb‘, l)

print(res)

print(list(res))

运行结果:

<map object at 0x0000000000830710>

[‘alex_sb‘, ‘wupeiqi_sb‘, ‘yuanhao_sb‘]

获取每个元素的平方

num=[2,4,6,8]

res=map(lambda x:x**2, num)

print(list(res))

运行结果:

[4, 16, 36, 64]

reduce():

reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

例如:

l=[1,2,3,4,5]

print(reduce(lambda x,y:x+y, l, [10])) #[10]是一个初始值,不指定则直接将第一次迭代出来的值作为初始值,指定后,则会将初始值与迭代出来的值做运算

运行结果:

25

它是这样一个过程:每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。

10,面向对象使用的内置函数

super(),isinstance(),issubclass(),classmethod(),staticmethod(),proerty(),hasattr(),getattr(),setattr()

super():调用父类的方法

isinstance():检查对象是否是类的对象,返回True或False

issubclass():检查一个类是否是另一个类的子类。返回True或False

classmethod():# 用来指定一个方法为类的方法,由类直接调用执行,只有一个cls参数,执行雷的方法时,自动将调用该方法的类赋值给cls.没有此参数指定的类的方法为实例方法

staticmethod

property

delattr():# 删除对象的属性

hasattr

hasattr(object,name)

判断对象object是否包含名为name的特性(hasattr是通过调用getattr(object,name))是否抛出异常来实现的。

参数object:对象

参数name:特性名称

>>> hasattr(list, ‘append‘)

True

>>> hasattr(list, ‘add‘)

False

getattr():获取对象的属性

setattr():与getattr()相对应

import time

m=__import__(‘time‘) #以字符串的形式导入模块

m.sleep(3000)

递归调用

在函数调用过程中,直接或间接调用了函数本身,就是函数的递归调用

1,必须有一个明确的结束条件

2,每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3,递归效率不高,递归层次过多会导致栈溢出[在计算机中,函数调用是通过stack栈这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出]

例如:

def f1():
    print(‘from f1‘)
    f1()
f1()

python不会无限递归,当达到最大递归数时会提示错误并终端递归

RecursionError: maximum recursion depth exceeded while calling a Python object

# 查看递归最大层数

import sys

print(sys.getrecursionlimit())

#设置递归最大层数

print(sys.setrecursionlimit(10000))

典型示例:二分法

在一组数(可能会有成千上万个)中,查找某个数是否存在

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)
运行结果:
[1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
找的数在mid[18]右面
[20, 21, 22, 23, 30, 32, 33, 35]
找的数在mid[30]右面
[32, 33, 35]
找的数在mid[33]右面
[35]
没的分了,要找的数字[66]不在列表里
时间: 2024-11-05 23:49:58

13-函数3的相关文章

13.函数的类型和基本使用

第一:函数类型: /* 函数类型: 类似于C语言的指向函数的指针 类似于OC语言的block 函数类型是由函数的参数类型和返回值类型组成的 */ // 这两个函数的类型是 (Int, Int) -> Int func sum(a: Int, b: Int) ->Int { return a + b; } func sub(a: Int, b: Int) ->Int { return a - b; } // 可以利用函数类型定义函数变量和常量 var funcP:(Int, Int) -&

python基础13函数以及函数式编程

主要内容 函数基本语法及特性 参数与局部变 返回值 4.递归 名函数 6.函数式编程介绍 阶函数 8.内置函数 函数基本语法及特性 定义 数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一 个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变 量,y是x的函数.自变量x的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很 同的 函数是逻辑结构化和过程化的一种编程方法 函数的优点 减少重复代码 使程序变的可扩展 使程序

C语言基础(13)-函数

一. 函数的原型和调用 在使用函数前必须定义或者声明函数. double circle(double r); int main() { double length = circle(10); printf("length = %f\n", length); return 0; } double circle(double r) { return 2 * 3.14 * r; } 二. 函数的形参和实参 在调用函数的时候,函数大多数都有参数,主调函数和被调用函数之间需要传递数据. 在定义函

python基础13 ---函数模块3(正则表达式)

正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 2.正则表达式简介 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分 强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的

13 函数

传递参数 在bash shell 编程中, 向函数传递的参数仍然是位置参数的方式来传递的, 而不能传递数组等其他形式的变量, 这与C语言 或JAVA语言的函数传递是不同的. #!/bin/bash half() { let "n = $1" let "n = n/2" echo "In function half() n is $n" } #函数调用 let "m = $1" echo "Before the fun

2018.7.13 函数的进阶

1. 动态参数 位置参数的动态参数: *args 动态接收参数的时候要注意: 动态参数必须在位置参数后面 顺序: 位置参数, 动态参数*, 默认值参数 例子: def chi(a, b, *food, c="娃哈哈"): print(a, b, food, c) chi("香蕉", "菠萝") # 香蕉 菠萝 () 娃哈哈 默认值?生效 chi("香蕉", "菠萝", "葫芦娃") #

python基础13 ---函数模块4(configparser模块)

configparser模块 一.configparser模块 1.什么是configparser模块:configparser模块操作配置文件,配置文件的格式与windows ini和linux的cf文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值),其配置文件(INI文件)由节(section).键.值组成. 2.configparser模块简介. ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号"[ ]"内包含的为sect

gets()、puts()函数。字符串函数。字符串排序的例子。

1.实例程序:string.c的程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include<stdio.h> #define MSG "YOU MUST have many talents .tell me some." #define LIM 5 #define LINELEN 81 int main() { char name[LINELEN]; char

(九)JavaScript之【JS函数(定义、参数、调用、【闭包】)】[较深,胆小勿进]

定义: 1 /** 2 * 函数表达式 3 * 4 * Function() 构造函数 5 * 6 * 函数提升(Hoisting) 7 * JavaScript默认将当前作用域提升到前面去 8 * Hoisting应用在变量的声明和函数的声明 9 * [使用表达式定义函数时无法提升] 10 * 11 * 自调用函数 12 * 13 * 函数是对象*/ 1 //函数表达式储存在变量中 2 var x = function () { return 'message'; }; 3 4 console

Scheme高阶函数之函数作为返回值暨currying/柯里化

1.4.1currying/柯里化 通常,编程的函数可以有一个参数列表,而λ表达式要求单参数.所以,currying/柯里化--多个参数的函数转化为只有一个参数的多个函数的连续调用,需要函数作为返回值. 有λ表达式,λx. λy. ( 2x+3y) (define (F x y)(+ ( * 2 x) (* 3 y)));;;等价于下面的表示 (define F (lambda ( x y) (+ ( * 2 x) (* 3 y)) ) ) (F 2 3)            → 13 函数F