python3  函数2

全局变量:一直存在

局部变量:函数执行时存在,执行完毕后销毁;

lambda 表达式(又称匿名函数表达式)

作用: 创建一个匿名(无名)函数对象, 同 def 类似但不提供函数名;

语法: lambda [参数1  ,参数2, .......] :表达式     ; 注: [ ] 内部分表示可以省略;

语法说明: 1,lambda 只是一个表达式,它用来创建一个函数对象;

2, 当lambda 表达式执行(调用)时,返回的是冒号(:)后表达式的值;

3, lambda表达式创建的函数只能包含一条语句;

4,lambda比函数简单且可以随时创建和销毁;

5,lambda 有利于减少程序的耦合度;

例子:#def   myadd(x,y):

return   x + y

#可以写成 myadd = lambda  x,y : x + y

 myadd = lambda x, y: x + y
print(myadd)
print("20 + 30 =", myadd(20, 30))
#结果
#<function <lambda> at 0x0000000001CECB70>
#20 + 30 = 50 print("100 + 200 =",(lambda x,y:x+y)(100,200))
#100 + 200 = 300 def operator(fn, x, y):
return fn(x, y) operator((lambda a,b: a+b),100, 200)
operator((lambda a,b: a*b),100, 200)
#结果
#
#

练习:

 #求两个变量的最大值
print((lambda x,y:x if x>y else y)(100,200)) #
print((lambda x,y:x if x>y else y)(300,200)) #
#
def mymax(x,y):
if x > y:
return x
return y mymax(200,300)
#
def mymax2(x,y):
return max(x,y) #3
def mymax3(x,y):
return x if x>y else y

globals()  / locals() 函数

globals() 返回当前全局作用域内变量的字典;

locals()  返回单曲局部作用域内变量的字典;

 a = 1
b = 2
def fn(c, d):
e = 300
print("locals返回:",locals())
print("globals返回:",globals()) fn(100, 200)
#locals返回: {'e': 300, 'c': 100, 'd': 200}
#globals返回: {'a': 1, '__spec__': None, '__name__': '__main__', 'fn': <function fn at 0x00000000004CCB70>, '__cached__': None, '__file__': 'C:/Users/hiber/PycharmProjects/ZiZhen/2018年5月/0510/函数2.py', 'b': 2, '__package__': None, '__builtins__': <module 'builtins' (built-in)>, '__loader__': <_frozen_importlib.SourceFileLoader object at 0x000000000078C3C8>, '__doc__': None}
 a = 1
b = 2
def fn(c, d):
e = 300
print("locals返回:",locals())
print("globals返回:",globals())
m = globals() #全局变量
m['b']=500 fn(100,200)
print(b) #

eval() , exec()函数

eval() 函数:

作用: 把一个字符串当成一个表达式来执行,返回表达式执行后的结果;

eval() 格式:eval(source[, globals[, locals]]) -> value

例子:

 x = 100
y = 200
a = eval("x+y")
print(a) # s = input("请输入一个字符串:")
a = eval(s)
print(a)
#
#
#请输入一个字符串:x+y+x
#
 local_score = {'x': 5, 'y':10}
a = eval("x + y", None, local_score)
print("a=",a) #a=15
z = 300
a = eval("x * y + z", {'z': 3333},local_score)
print(a) #

exec()函数

作用:把一个字符串当做程序来执行

格式:exec(object[, globals[, locals]])    ;注:globals,locals的作用同eval

例子:

 x = 100
y = 200
s = "print('hello:',x,y)"
exec(s) #hello: 100 200
#
 gs = {'x':10 , 'y':20}
ls = {'x':1 , 'y':2}
exec("z = x + y",gs,ls)
print(ls) #{'y': 2, 'z': 3, 'x': 1}
print(gs)

练习:写一个程序解释执行器

 g = {}
l = {}
while True:
s = input("请输入程序: >>>")
if s == "break":
break
exec(s, g, l) #
#请输入程序: >>>x = 100
#请输入程序: >>>y = 100
#请输入程序: >>>print( "x + y", x + y)
#x + y 200
#请输入程序: >>>break
#

闭包   closure

概念:将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包;

说明: 如果一个内嵌函数访问函数外部作用域的变量,则这个函数就是闭包

 def func(x):
def fn(arg):
return arg ** x
return fn f1 = func(2)
y = f1(100)
print(y) #
#
f2 = func(3)
print(f2(3)) #
#
f3 = func(4)
print(f3(2)) #

函数式编程

概念: 是指用一系列函数解决问题;

函数是一等公民;

函数式编程的好处:

1,每个函数完成细小的功能, 一系列函数的任意组合可以完成大问题;

2,函数仅接收输入并产生输出,不包含任何可能影响输出的内部状态;

函数的可重入性:

可重入性是指输入一定,则输出必须一定

例:

#不可重入的函数:

 y = 200
def myadd(x):
return x + y print(myadd(10)) # y = 300
print(myadd(10)) #

#可重入的函数:

 def add2(x,y):
return x + y

优点: 易于测试,易于调试,更高的生产率,模块化,逻辑可证

高阶函数:

什么是高阶函数:

满足下列条件中的一个的函数即为高阶函数:

1, 函数结束一个或多个函数作为参数传入

2,函数返回一个函数

python中内置(builtins)的高阶函数:

map, filter , sorted

map函数:

map(func, *iterable)用函数和可迭代对象中的每个元素作为参数计算出新的可迭代对象,当最短的一个可迭代对象完成迭代后,此迭代生成结束;

例:

 #例
def power2(x):
return x ** 2
#生成一个迭代器,此迭代器可以生成1-9的自然数的平方;
#1,4,9,16...
mit = map(power2, range(1,10))
print(mit) #<map object at 0x000000000219C4E0> map生成一个可迭代对象
for x in mit:
print(x, end=' ') #1 4 9 16 25 36 49 64 81

练习:生成一个迭代器,此迭代器可以生成 1*4 , 2*3 , 3*2, 4*

 def fn(x,y):
return x * y mit2 = map(fn, [1,2,3,4], [4,3,2,1])
#for x in mit2:
# print(x, end=' ')
a = [x for x in mit2 ]
print(a) #[4, 6, 6, 4]

练习:

 #给出一个数n,写一个函数计算 1+2**2+3**3+ ...+ n*n的和;
#用pow, sum, map ,range函数
n = int(input("Please enter:"))
def func(x):
return pow(x, x) s1 = sum(map(func, range(1, n)))
print(s1)
 #
def mysum(n):
def power(x):
#return x ** x
return pow(x, x)
mit = map(power, range(1, n + 1))
return sum(mit) print(mysum(10))
#
def mysum(n):
return sum(map(lambda x:pow(x,x),range(1, n + 1))) print(mysum(10))
#
def mysum(n):
return sum(map(pow, range(1, n + 1),range(1, n + 1))) print(mysum(10))
 #求 1**9 +2**8 + ....+ 9**1的和;
def mysum(n):
return sum(map(lambda x,y:pow(x, y),range(1,n + 1),range(n, 0,-1))) print(mysum(9)) #

filter 函数

filter( function or  None,  iterable) --> filter object

作用: 筛选序列中数据,返回一个可迭代对象,此刻迭代对象将对iterable 进行筛选;

说明 : function 将对iterable中的每个元素进行求值,返回False则将此数据丢弃,返回True, 则保留此数据;

例子: L = [x for x in range(10) ]     #[0,1,2,3,4,5,6,7,8,9]

 def isadd(x):  #如果为奇数返回True
return x % 2 ==1 L = [x for x in filter(isadd,range(10))]
print(L) #[1, 3, 5, 7, 9]

sorted 函数

作用: 将原可迭代对象的数据进行排序,生成排序后的列表;

格式:sorted(iterable, key=None, reverse=False) --> new sorted list

说明: key函数用来提供一个值,这个值将作为排序的依据;

例子:

 L = [5, -2, -3, 0, 1, -4]
L1 = sorted(L)
print(L1) #[-4, -3, -2, 0, 1, 5]
L2 = sorted(L, reverse=True)
print(L2) #[5, 1, 0, -2, -3, -4]
L3 = sorted(L, key=abs)
print(L3) #绝对值[0, 1, -2, -3, -4, 5]
names = ['Tom', 'Jack', 'Xiaoli', 'Ming']
s1 = sorted(names)
print(s1) #['Jack', 'Ming', 'Tom', 'Xiaoli']
s2 = sorted(names, key=len)
print(s2) #'Tom', 'Jack', 'Ming', 'Xiaoli']
s3 = sorted(names, reverse=True)
print(s3) #['Xiaoli', 'Tom', 'Ming', 'Jack']
#思考
#排序依次:'moT' 'kcaJ' 'gniM' 'iloaiX'
# 3 2 0 1
def k(x):
return x[::-1] s5 = sorted(names, key=k)
print(s5) #['Ming', 'Xiaoli', 'Jack', 'Tom']
#
s6 = sorted(names,key=lambda x:x[::-1])
print(s6) #['Ming', 'Xiaoli', 'Jack', 'Tom']

递归函数 recursion

函数直接或间接的调用自身

例子:

 def f():
print("hello")
f() f() #调用函数
print("调用完成")

说明:递归一定要控制递归层数,当符合某一个条件时要终止递归调用几乎所有的递归都能用while循环来替代;

优点: 可以把问题简化,让思路更清晰,代码更简洁;

缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果;

 #计算阶乘
#循环实现
def myfac(x):
r = 1
for i in range(1, x + 1):
r *= i
return r print("5的阶乘:", myfac(5)) # #
def func(n):
if n == 1:
return 1
return n * func(n - 1) print("5!=", func(5)) #5!= 120

练习:

 #1,用filter函数将1~100之间的所有素数prime放入到列表中打印出来
def p(x):
if x <= 1:
pass
else:
return x % 2 == 1 L = filter(p, range(1,101))
#print(L)
L1 = []
for x in L:
L1.append(x)
#print(x, end=' ')
print(L1)
#
#[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

Python之路,第十一篇:Python入门与基础11的更多相关文章

  1. Python之路(第二十一篇) re模块

    一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...

  2. Python之路(第十一篇)装饰器

    一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1 ...

  3. 【Python之路】第九篇--Python基础之线程、进程和协程

    进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...

  4. 【Python之路】特别篇--Python面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. Python之路【第九篇】堡垒机基础&数据库操作

    复习paramiko模块 Python的paramiko模块,是基于SSH用于连接远程服务器并执行相关操作. SSHClient #!/usr/bin/env python #-*- coding:u ...

  6. Python之路(第八篇)Python内置函数、zip()、max()、min()

    一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...

  7. Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...

  8. Python之路(第五篇) Python基本数据类型集合、格式化、函数

    一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...

  9. 【Python之路】特别篇--Python切片

    字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...

  10. 【Python之路】特别篇--Python内置函数

    abs() 求绝对值 i = abs(-100) print(i) # 100 all() 循环里面的参数 如果每个元素都为真,那么all返回值为真  假: 0 False None "&q ...

随机推荐

  1. Eclipse导出WAR包

    参考: https://jingyan.baidu.com/article/ab0b56309110b4c15afa7de2.html

  2. UNIX发展史简介

    1965年贝尔实验室(Bell Labs).通用电气(General Electric)和麻省理工学院(MIT)欲共同打造MULTICS(Multiplexed Information and Com ...

  3. Struts 2 初步入门(六)之处理结果类型

    Struts2 处理流程: 用户请求--->struts框架--->Action控制器--->struts框架--->视图资源 xml配置文件里: <result nam ...

  4. sql server 根据身份证号计算出生日期和年龄的存储过程

    我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄 在sql中,具体的存储过程实现是这样的: /******************************************** ...

  5. Linux c++ time different

    下面这个函数可以得到微秒级别: #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); 函数&q ...

  6. 请问微信小程序let和var以及const有什么区别

    在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...

  7. linux磁盘管理 磁盘查看操作

    df查看磁盘分区使用状况 df --显示磁盘分区使用状况 'l' 仅显示本地磁盘(默认) 'a' 显示所有文件系统的磁盘使用情况,包含比如/proc/ 'h' 以1024进制计算最合适的单位显示磁盘容 ...

  8. windows 日常使用

    打开任务管理器:shift+ctrl+esc 各种快捷打开的方式 regedit.msc 注册表 gpedit.msc 组策略 lusrmgr.msc本地用户和组 CMD命令窗口打开任务管理: tas ...

  9. C#通过shell32获取文件详细备注信息

    1.从系统Window/System32文件夹中Copy出 Shell32.dll Com组件 将Shell32.dll文件引用到项目中,并设置“嵌入互操作类型”为false http://blog. ...

  10. Animation和Animator 的区别

    此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...