(八)函数

函数与函数式编程

编程方式:

1.面向对象:类(class)

2.面向过程:过程(def)

3.函数式编程(最早):函数(def)

函数:函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这个函数,只需调用这个函数名即可

特性:

1.减少重复代码

2.使程序变得可扩展

3.使程序变得易维护

#定义一个函数,关键字是def

def funch1():

  print("你好,函数!")

  return 100

#定义一个过程

def funch2():

  print("面向过程")

funch1()

funch2()

#a,b是形式参数,3,1是实际参数,实际参数和形式参数都是一一对应的

函数是一段可以重复调用的代码,通过输入的参数,返回对应的结果。

1.函数调用的时候,实际参数的值顺序与形式参数的顺序是一一对应的。

2.挡在函数调用的时候,指定了形式参数的实际参数,这个时候并不是一一对应,而是根据指定的值来进行的

def add (a,b):

  print(a+b)

add(3,1)

add(b=2,a=100)#也可以这样指定参数

#定义一个函数的默认值,username='xiao'就是login函数的默认参数

def login(username='xiao'):

  pass

#当一个函数,既有默认参数,也有形式参数的时候,默认参数要写在形式参数后面

def f1(name,age=12):

  pass

#函数的返回值

1.一个函数,他是有返回值的

2.当一个函数,没return关键字的时候,他的返回值是None

3.当一个函数有return关键字的时候,他的返回值是return后面的表达式或值

函数返回值的意义:函数/方法的返回值是为了给另外一个函数/方法一个请求的参数

def f2(a,b):

  return a+b

print f2(4,6)

#动态参数

*args:数据类型是元组

**kwargs:数据类型是字典

def f3(*args):

  print args,type(args)

def f4(**kwargs):

  print kwargs,type(kwargs)

#动态参数应用

def f5(name,age,sex,**kwargs):

  print ('用户信息:',name,age,sex,kwargs)

f5('xiaochao',15,'boy'phone='15289710022',address='jia')

#万能参数

def f6(*args,**kwargs):

  print args,kwargs

f6(34,'swa',addres='chengdu')

#全局变量和局部变量

name='zhangsan'#全局变量

def su1();

  print(name)

su1()#输出zhangsan

def us1():

  name = 23#局部变量

  print (age)

us1()#输出23

 

#通过global可以对全局变量进行修改

def su2():

  global name#通过global可以对全局变量name进行修改

  name='lisi'

  print(name)
su2()#输出lisi

二、函数与函数式编程:
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。
,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,
不论什么时候调用,调用几次,值都是不变的。
函数并不是函数式编程

高阶函数:
变量可以指向函数,函数得参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数
'''
def add(a,b,f):
return f(a)+f(b)
res = add(3,-8,abs)
print(res)
'''
x:形参,变量只有在被调用的时候才分配内存单元,在调用结束时,既刻释放所分配的内存单元,
因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
3,4:实参,可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,
它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
'''
def test(x,y):
print(x)
print(y)

test(3,4)
x = 22
test(x,23)

#默认参数,特点:调用函数的时候,默认参数可有可无(非必传)
#用途:1.默认值
def test1(x,y=2):
print(x)
print(y)
test1(3,11)#重新给y赋值

#*args:接收N个位置参数,把不固定的元素变成列表
def test2(x,*args):
print(x)
print(args)
test2(1,2,3,4,5)

test2(1,2,3,4,5,)
test2('带*:',*[1,23,4,5,3])

#**kwargs:把N个关键字参数,转换成字典的方式
def test3(**kwargs):
print(kwargs)

test3(name = 'alex',age = 34,sex = 'N')

二、装饰器

装饰器:
定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:1.不能修改被装饰得函数得源代码。
2.不能修改被装饰得函数的调用方式
实现装饰器知识储备:
1.函数即“变量”
2.高阶函数
3.嵌套函数

高阶函数+嵌套函数=>装饰器


'''
import time
def timer(func):
def warpper(*args,**kwargs):
start_time = time.time()
func()
stop_time = time.time()
print('the func run time is %s'%(stop_time-start_time))
return warpper()

@timer
def test():
time.sleep(2)
print('in the test')

test()

三、递归
'''
递归:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

'''
def calc(n):
print(n)
if int(n/2) == 0:
return n
return calc(int(n/2))
calc(222)

四、装饰器【案例】

import time
def timer(func):#timer(test1) func = test1
def deco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs) #return func
stop_time = time.time()
print('the func run time is %s' % (stop_time - start_time))
return deco
@timer
def test1():
time.sleep(3)
print('in the test1')
@timer
def test2(name,age):
time.sleep(3)
print('in the test2',name,age)

test1()
test2('xiaochao',24)

 

posted @ 2019-01-04 10:44  燕鸻  阅读(193)  评论(0)    收藏  举报