Python之路,第十一篇:Python入门与基础11
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的更多相关文章
- Python之路(第二十一篇) re模块
一.re模块 正则表达式本身是一种小型的.高度专业化的编程语言,正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是re,正则表达式模式被编译成一系列的字节码,然 ...
- Python之路(第十一篇)装饰器
一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1 ...
- 【Python之路】第九篇--Python基础之线程、进程和协程
进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...
- 【Python之路】特别篇--Python面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python之路【第九篇】堡垒机基础&数据库操作
复习paramiko模块 Python的paramiko模块,是基于SSH用于连接远程服务器并执行相关操作. SSHClient #!/usr/bin/env python #-*- coding:u ...
- Python之路(第八篇)Python内置函数、zip()、max()、min()
一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...
- Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...
- Python之路(第五篇) Python基本数据类型集合、格式化、函数
一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...
- 【Python之路】特别篇--Python切片
字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...
- 【Python之路】特别篇--Python内置函数
abs() 求绝对值 i = abs(-100) print(i) # 100 all() 循环里面的参数 如果每个元素都为真,那么all返回值为真 假: 0 False None "&q ...
随机推荐
- Eclipse导出WAR包
参考: https://jingyan.baidu.com/article/ab0b56309110b4c15afa7de2.html
- UNIX发展史简介
1965年贝尔实验室(Bell Labs).通用电气(General Electric)和麻省理工学院(MIT)欲共同打造MULTICS(Multiplexed Information and Com ...
- Struts 2 初步入门(六)之处理结果类型
Struts2 处理流程: 用户请求--->struts框架--->Action控制器--->struts框架--->视图资源 xml配置文件里: <result nam ...
- sql server 根据身份证号计算出生日期和年龄的存储过程
我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄 在sql中,具体的存储过程实现是这样的: /******************************************** ...
- Linux c++ time different
下面这个函数可以得到微秒级别: #include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp); 函数&q ...
- 请问微信小程序let和var以及const有什么区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...
- linux磁盘管理 磁盘查看操作
df查看磁盘分区使用状况 df --显示磁盘分区使用状况 'l' 仅显示本地磁盘(默认) 'a' 显示所有文件系统的磁盘使用情况,包含比如/proc/ 'h' 以1024进制计算最合适的单位显示磁盘容 ...
- windows 日常使用
打开任务管理器:shift+ctrl+esc 各种快捷打开的方式 regedit.msc 注册表 gpedit.msc 组策略 lusrmgr.msc本地用户和组 CMD命令窗口打开任务管理: tas ...
- C#通过shell32获取文件详细备注信息
1.从系统Window/System32文件夹中Copy出 Shell32.dll Com组件 将Shell32.dll文件引用到项目中,并设置“嵌入互操作类型”为false http://blog. ...
- Animation和Animator 的区别
此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...