-
返回列表中最大的和第二大的元素,不允许使用Python内置的排序和最大函数。
2020-12-22 09:51:02返回列表中最大的和第二大的元素,不允许使用Python内置的排序和最大函数。 冒泡排序 # 冒泡排序 def item(ls): n = 0 while n < len(ls): for i in range(len(ls) - 1): if ls[i] > ls[i + 1]: ...返回列表中最大的和第二大的元素,不允许使用Python内置的排序和最大函数。
冒泡排序
# 冒泡排序 def item(ls): n = 0 while n < len(ls): for i in range(len(ls) - 1): if ls[i] > ls[i + 1]: ls[i], ls[i + 1] = ls[i + 1], ls[i] n += 1 return ls[-1], ls[-2] print(item([321, 5345, 3466, 31, 213, 3223, 3, 423])) # 第二种方法 # 先默认将第一个和第二个数比较赋值给第一大和第二大 # 从第三个数开始 跟第一大比较 如果有更大的 把之前最大值赋值给第二大值 def find_max_two(items:list): first,second = (items[0],items[1]) if items[0]>=item[1]\ else (items[1],items[0]) for _ in range(2,len(items)): if items[_]>first: second = first first = items[_] elif items[_]>second: second = items[_] return first,second
-
C++ 在函数中使用静态局部变量,让函数返回数组
2020-08-25 08:23:43C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: int * myFunction() {...C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。
如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:
int * myFunction() { . . . }
另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。例如:
#include <iostream>
using namespace std;int a[10] = { 10,20 };
char *GetCharArr()
{
static char sss[20] = { 0 };
sprintf_s(sss, "ABABXX%d", a[0]);cout << sss << endl;
return sss;
}int main()
{
char *xxx;
xxx = GetCharArr();
printf("当前的字符串是:%s", xxx);
system("PAUSE");
return 0;
}另一个例子:
#include <iostream>
#include <ctime>
#include <cstdlib>using namespace std;
// 要生成和返回随机数的函数
int *getRandom()
{
static int r[10];// 设置种子
srand((unsigned)time(NULL));
for (int i = 0; i < 10; ++i)
{
r[i] = rand();
cout << r[i] << endl;
}return r;
}// 要调用上面定义函数的主函数
int main()
{
// 一个指向整数的指针
int *p;p = getRandom();
for (int i = 0; i < 10; i++)
{
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
}return 0;
} -
python3入门笔记四之函数式编程---高阶函数,返回函数,匿名函数,装饰器,偏函数
2020-07-22 18:54:09我的个人网站 www.ryzeyang.top 内容概览 入门python的学习笔记四 之 python3 函数式编程---高阶函数,返回函数,匿名函数,装饰器, ...由于Python允许使用变量,因此,Python不是纯函数式编程语言我的个人网站 www.ryzeyang.top
内容概览
入门python的学习笔记四 之 python3 函数式编程—高阶函数,返回函数,匿名函数,装饰器,偏函数的使用
廖雪峰老师的Python教程 第四弹之函数式编程—高阶函数,返回函数,匿名函数,装饰器,偏函数 fighting 😆
函数式编程
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言高阶函数(Higher-order function)
特点:
- 变量可以指向函数 即 函数本身也可以赋值给变量
x=abs x(-10) #10
- 函数名也是变量
abs = 10 abs(-10) # TypeError: 'int' object is not callable
注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10
- 传入函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
def add(x, y, f): return f(x) + f(y) print(add(-5, 6, abs)) # 11
map/reduce,filter,sorted
map/reduce的概念: Google论文“MapReduce: Simplified Data Processing on Large Clusters”
这四个用法同es6.
-
map()函数接收两个参数,一个是函数,一个是Iterable 返回一个Iterator
def f(x): return x**2 a=map(f,[x for x in range(10)]) print(next(a)) # 0 print(list(a)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
把这个list所有数字转为字符串:
print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']
-
reduce() 把结果继续和序列的下一个元素做累积计算:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
序列[1, 3, 5, 7, 9]变换成整数13579:from functools import reduce def fn(x,y): return x*10+y print(reduce(fn,[1,3,5,7,9])) #13579
str转换为int:
from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def char2num(s): return DIGITS[s] def str2int(s): return reduce(lambda x, y: x * 10 + y, map(char2num, s)) print(str2int('0123456789')) # 123456789
-
filter() 接收一个函数和一个序列 ,返回的是一个Iterator
过滤出符合条件的数def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
-
sorted() 接收一个序列和一个函数
sorted([36, 5, -12, 9, -21])
按绝对值大小排序:sorted([36, 5, -12, 9, -21], key=abs) # [5, 9, -12, -21, 36]
要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_name(t): return t[0] L2 = sorted(L, key=by_name,reverse=True) print(L2)
返回函数
函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
可变参数的求和(立刻返回计算结果):
def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax
返回求和的函数:
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum f = lazy_sum(1, 3, 5, 7, 9) f() #25
闭包(注意!)
返回闭包时牢记一点:返回函数不要引用任何 循环变量,或者后续 会发生变化的变量。
def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() # f1() 9 # f2() 9 # f3() 9 # 全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fs for fn in count(): print(fn()) # 1 4 9
匿名函数
关键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
lambda x: x * x ` #等于 def f(x): return x * x
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
# 把匿名函数赋值给一个变量,再利用变量来调用该函数 f = lambda x: x * x f(5) #25 # 匿名函数作为返回值返回 def build(x, y): return lambda: x * x + y * y
装饰器
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
本质上,decorator就是一个返回函数的高阶函数看看下面的代码,瞬间明白,这个不就是Spring 的 aop思想吗,这用法像java的注解 哈哈
@log def now(a,b,*,age): print('2015-3-25') def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) # __name__获取函数对象的名字 print( args) print( kw) return func(*args, **kw) return wrapper now('1','1',age=12) # call now(): # ('1', '1') # {'age': 12} # 2015-3-25
把@log放到now()函数的定义处,相当于执行了语句:
now = log(now)
wrapper()函数的参数定义是(*args, **kw)
,因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。def log(text): def decorator(func): def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print('2015-3-25') # 等于 now = log('execute')(now) now() # execute now(): # 2015-3-25
剖析: now = log(‘execute’)(now)
首先执行log(‘execute’),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。
函数也是对象,它有__name__等属性
所以最后会出现now.__name__ #'wrapper'
的情况
这样子会导致有些依赖函数签名的代码执行错误但是Python内置的
functools.wraps
就是用来 把原始函数的__name__
等属性复制到对应的函数中
如:@functools.wraps(func) def wrapper(*args, **kw):
修改后运行
now.__name__
。结果为 #now偏函数
偏函数是参数固定的函数,即有默认值的函数
Python的
functools
模块提供了很多有用的功能,其中一个就是偏函数(Partial function),functools.partial
就是帮助我们创建一个偏函数的,
它可以帮我们固定函数的参数,返回一个新的函数
可以接收函数对象、*args和**kw这3个参数如 int 函数
import functools int2 = functools.partial(int, base=2) int2('1000000') # 64
如 max函数
import functools # 实际上会把10作为*args的一部分自动加到左边 √ (廖老师的课程真给力 ☆( ̄▽ ̄)/$:*) max2 = functools.partial(max, 10) max2(5, 6, 7) # 10
- 变量可以指向函数 即 函数本身也可以赋值给变量
-
函数的返回值返回概念
2020-04-27 19:08:49函数的返回值返回值概念 ...一个函数中可以写无数个,但是只能执行一次return,一次只能返回一个数据,不允许返回多个数据 返回到哪 返回到函数的执行语句 函数名(),既是在执行函数,也是在拿返回值 注意...函数的返回值返回值概念
函数自身的处理数据或执行结果,需要被二次使用或其他程序调用时,需要将数据返回出来
如何拿到返回值
关键字:return 要返回的数据
return的功能
可以让函数返回指定的值
可以立即结束当前函数
一个函数中可以写无数个,但是只能执行一次return,一次只能返回一个数据,不允许返回多个数据
返回到哪
返回到函数的执行语句
函数名(),既是在执行函数,也是在拿返回值
注意:一个函数如果没有return,那么返回的是undefined;如果有return,那么返回值就是return后面的值
可以返回哪些数据
所有数据
当返回函数时,形成了闭包(后期概念)
什么时候需要返回值?
功能性函数(打印表格,改颜色)
可以有,但是没有必要有返回值
处理数据的函数(补零,计算器,计算圆的面积)
一般都有,返回数据
作用域:谁作用的哪个区域
谁:数据(变量)
哪个:如何划分,函数就是一个区域
全局
不属于任何一个函数
全局作用域中的变量,叫全局变量
全局作用域中的函数,叫全局函数
生命周期:一直存在
耗性能,但是方便
少用全局
局部:
任何一个函数内部都是局部作用域
局部作用域中的变量,叫局部变量
局部作用域中的函数,叫局部函数
生命周期:朝生暮死
节省内存,不方便
函数的参数(形参):是当前函数的局部变量
匿名函数
利用匿名函数解决全局耗性能,局部不方便的问题
(function(){})()
变量的读写规则:当全局和局部的变量名重复时
读的规则:
向上级作用域查找,找到了,就使用,同时,停止查找;找到顶级作用域,都没有,报错
写(设置,赋值)的规则:
向上级作用域查找,找到了,就写入,同时,停止查找;找到顶级作用域,都没有,会默认在顶级作用域声明这个变量,然后使用
注意:声明变量时,必须加声明关键字,不加声明关键字,可能能执行,但是不规范 -
用Python写一个计算器,不允许使用计算器方面的内置函数,只能使用+-,使用到正则表达式。...
2019-09-24 00:22:45计算表达式:1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*...第1步:创建一个函数search_bracket_exp,通过re.rearch找到括号里面的表达式,传入到第二个函数用于表达式计算。返回一个新的表达式。express.r... -
c++不允许使用抽象类类型对象,我明明每个函数都实现了的
2015-10-03 11:29:20//私有函数,前序输出subTree二叉树的所有数据 if (subTree != NULL) { out << subTree->data ; Traverse(subTree->leftChild,out); Traverse(subTree->rightChild,out); } } template ... -
VBCDeclFix:此外接程序允许在VB6中使用Cdecl函数-源码
2021-02-10 02:00:27此方法返回结构,其中callconv成员包含外部函数的调用约定。 然后,VBA6在其自己的结构中使用此信息,这些结构描述了项目中的功能。 在生成P代码期间,运行时将提取此信息,以将指定的函数与相应的P代码 -
c++从函数返回数组的方法代码
2020-12-20 19:51:05C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: int * myFunction() { ... -
Python Map 函数的使用
2020-12-17 02:17:10map()是一个 Python 内建函数,它允许你不需要使用循环就可以编写简洁的代码。 一、Python map() 函数 这个map()函数采用以下形式: map(function, iterable, ...) 它需要两个必须的参数: function – 针对每一... -
python调用计算器_用Python写一个计算器,不允许使用计算器方面的内置函数,只能使用+-,使用到正则表达式...
2020-11-29 20:04:59计算表达式:1 - 2 * ( (60-30 +(-40/5) * ...解题思路:第1步:创建一个函数search_bracket_exp,通过re.rearch找到括号里面的表达式,传入到第二个函数用于表达式计算。返回一个新的表达式。express.replace(括号... -
只允许使用 + - * / 和 Math.* ,求一个函数 y = f(x, a, b);当 x > 100 时返回 a 的值,否则返回 b 的值
2021-01-11 09:29:50只允许使用 + - * / 和 Math. ,求一个函数 y = f(x, a, b); 当 x > 100 时返回 a 的值,否则返回 b 的值, 不能使用 if else 等条件语句,也不能使 用 |,?:,数组。* function f(x, a, b) { var temp = Math.... -
函数(参数,作用域,返回函数,匿名函数,偏函数)
2018-04-08 19:38:00函数参数: python 中的函数参数...函数调用使用关键字确定传入的参数值,允许实参和形参的顺序不一致,因为 python 解释器能够用参数名匹配参数值 代码: 1 #!/usr/bin/python3 2 3 def personinfo... -
函数式编程——高阶函数(map/reduce/filter/sorted)、返回函数(闭包)
2019-06-10 22:49:18而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。Python对函数式编程提供部分支持,由于Python允许使用变量,因此,Python不是纯函数式... -
C语言使用技巧(十五):函数返回数组和带有数组的链表结构体
2020-09-26 00:57:25C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 实现源码: #include <stdio.h> #include <stdlib.h> #include <time.h> /* ... -
C++函数返回引用的情况说明
2016-06-26 11:44:04引言(废话)即将考试C++,老师发了一些资料讲了一些比较琐碎的细节,其中有一个就是关于...函数返回引用,都应该是返回指向一个对象的引用(引用的实际实现其实就是指针,只不过该指针不允许被改变,且该指针每次使用 -
C从函数返回数组
2018-11-08 11:05:04C 语言不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针。如果您想要从函数返回一个一维数组,必须声明一个返回指针的函数,如下: int * myFunction() { } ... -
返回指针_C 从函数返回指针
2021-01-15 10:58:05为了做到这点,您必须声明一个返回指针的函数,如下所示:int * myFunction(){...}另外,C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为static变量。现在,让我们来看下面的函数,它会生成 10 个... -
返回:使您的函数返回有意义,有类型且安全的内容!-源码
2021-02-03 00:37:52使您的函数返回有意义,正确输入和安全的内容! 产品特点 将函数式编程带入Python领域 提供大量原语来编写声明性业务逻辑 加强架构 带有注释的完整类型,并经mypy检查,与 添加了模拟的高级类型支持 提供类型安全的... -
什么是lambda函数?使用lambda函数有什么好处?
2018-05-29 18:15:09(一)什么是lambda函数:Python支持一种有趣的语法,它允许你快速定义单行的最小函数。... (注意:lambda 函数不能包含命令,它们所包含的表达式也不能超过一个)(二)使用lambda函数的好处:1、lambda函数比较... -
python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
2021-01-13 05:46:53如果该数字中的数字按递增顺序排序,则该函数返回True,否则返回False。允许重复的数字。该函数也应该能够处理负数。根据定义对单个数字进行排序。因此func(0),func(112234)或func(-345669)返回True,但func(4321)... -
主函数的返回值返回给谁_函数的返回值、作用域、和读写顺序
2020-12-30 14:46:24一、函数函数的返回值返回值概念- 函数自身的处理数据或执行...- 可以立即结束当前函数 - 一个函数中可以写无数个,但是只能执行一次return,一次只能返回一个数据,不允许返回多个数据- 返回到哪 - 返回到函数的执... -
c++中函数放在等号右边_如何从C或C++中的函数返回多个值?
2021-01-18 18:21:04新程序员通常在寻找从函数返回多个值的方法。不幸的是,C和C++不允许直接这样做。但是幸运的是,通过一些巧妙的...主要问题是调用多个函数的麻烦,因为我们需要返回多个值,并且当然要键入更多的代码行。1)使用指针... -
C++中函数指针的使用
2015-08-25 09:33:59函数的地址是存储其机器语言代码的内存的开始地址。 1、获取函数的地址 直接使用函数名(不跟参数)即可。...3、使用函数指针来调用被指向的函数 pf =pam; 以下两种格式都可以(C++都允许): double x= pf(5); -
指针的高阶用法——从函数返回指针
2019-01-13 20:22:00在上一章中,我们已经了解了 C 语言中如何从函数返回数组,类似地,C 允许您从函数返回指针。...现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址... -
c c++ 函数内数组初值_C 从函数返回指针
2020-11-29 04:34:39为了做到这点,您必须声明一个返回指针的函数,如下所示:int * myFunction(){...}另外,C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为static变量。现在,让我们来看下面的函数,它会生成 10 个... -
C++ 从函数返回数组
2018-11-09 20:45:42C++ 不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。 如果想要从函数返回一个一维数组,就必须声明一个返回指针的函数,如下: int * myFunction() { ... -
python 函数式编程 库_使用Python的toolz库开始函数式编程
2020-11-30 03:07:40toolz 库允许你操作函数,使其更容易... 这些数据结构使得我们可以编写“纯”函数,或者说是没有副作用的函数,仅仅接受一些参数并返回结果,同时保持良好的性能。在这篇文章中,我们使用 toolz 库来构建。 这个库... -
JS的函数简介与使用
2017-01-19 16:09:27function表示函数定义,abs为函数名,括号中为参数,多个...JS允许传入任意个参数而不影响调用。 还有一种匿名函数的定义: 利用arguments可以获得调用者传入的所有参数,即使函数未定义参数。
-
数据类型转换
-
树莓派自启动
-
MySQL 函数、用户自定义函数
-
Navicat Premium.rar
-
【链表】:输入一个链表,输出该链表中倒数第k个结点。
-
access应用的3个开发实例
-
linux系统下文件夹没有权限
-
必得科技首次公开发行股票招股说明书.pdf
-
音视频格式转换工具.rar
-
docker菜鸟学习笔记之ubuntu容器中安装python3和卸载python2
-
远程桌面多窗口工具.rar
-
[内部保密,禁止传播]天融信数据安全解决方案.pptx
-
生益电子首次公开发行股票并在科创板上市招股说明书.pdf
-
SpringBoot 2.3.x整合Swagger3.x接口文档+Knife4jUI
-
呆逼萌新的课题要求.txt
-
2014年重庆理工大学《ERP原理及应用I》两套期末考试试卷.pdf
-
Dockerflie:tf-nightly-gpu-docker-cuda11.1
-
2014年重庆理工大学《高级C#开发技术》两套期末考试试卷.pdf
-
app软件测试全栈系列精品课程
-
BNUZ计科一班作业第七题,负数进制