hechengwei

导航

Python开发——5.函数

一、函数的定义

def test(x)
    "The Function definitions"
    x += 1
    return x

def:定义函数的关键字

test:函数名

():定义形参

“”:文档描述

x += 1:泛指代码块或程序处理逻辑

return:定义返回值(出现return,函数结束)

调用运行时,可带参数也可不带:函数()

优点:代码重用,保持一致性易维护,可扩展性

二、函数和过程

1.过程即没有返回值的函数,由于Python中没有使用return返回值时,会返回None,所以过程在Python中也是函数

2.返回值

def test01():
    pass
def test02():
    return 0
def test03():
    return 0, 10, 'hello', ['kobe', 'lbj'], {'Team': 'lakers'}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1,t2,t3)

返回值数为0,返回None,返回值数为1,返回object,返回值数>1,返回tuple。

三、函数参数

1.形参和实参

def calc(x,y):#x,y为形参
    res = x ** y
    return res
t = calc(1,2)#1,2为实参
print(t)

  形参只在函数调用时才分配内存单元,调用结束后立即释放,因此形参只在函数内部有效

  实参可以是常量、变量、表达式、函数,在函数调用时,实在必须有确定的值以便把值传给形参

2.位置参数和关键字参数

def test(x,y,z):
    print(x,y,z)
test(1,2,3)#位置参数
test(x=1,z=3,y=2)#关键字参数
test(1,y=2,z=3)

  位置参数必须一一对应,不能多或少,关键字参数无须一一对应,也不能多或少,二者可以混用,但位置参数必须在关键字参数左边否则报错。

3.默认参数

def power(x, n=2):#n为默认参数
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    print(s)
    return(s)

power(4,4)

  默认参数可以降低函数调用的难度,但设置的时候要注意,不能用可变对象

def add_end(L=[]):
    L.append('END')
    return L

# print(add_end([123,456]))
print(add_end())
print(add_end())
print(add_end())

4.参数组

def test(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
test(1,2,3,4,5,y=12,z=22)

  *args传的是列表或元组,**kwargs传的是字典

(1)定义可变参数用*

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
s = calc(1,2,3)
print(s)
num = [1,2,3,4]
s = calc(*num)
print(s)

(2)定义关键字参数用**

def person(name, age, **kw):
    print("name:", name, "age:", age, "other:", kw)
person("hechouzi", 25,city="jiangsu",height=183)
extra = {"city":"jiangsu","height":183}
person("heheh",12,**extra)

四、全局变量和局部变量

  全局变量全部大写,局部变量全部小写

  函数中如果没有global参数,且没有声明局部变量,函数内部可以调用全局变量,但不可修改

  函数中如果有global参数,可以对全局变量进行修改

  函数中如果定义了局部变量,则优先读取局部变量

NAME = "KOBE"
def change_name():
    global NAME
    name = "LBJ"
    print("Who am i:",NAME)
    print("Who are you:",name)
    NAME = "BYRANT"
    print("Now,who am i:",NAME)
    print("Now,who are you:",name)
change_name()
print(NAME)
print(name)#报错,因为是局部变量

五、前向引用

  “函数即变量”

def test1():
    print("from test1")
    test2()
def test2():
    print("from test2")
test1()

前向引用就是在定义函数之前引用

六、嵌套函数和作用域

def test1():
    name = "Jordan"

    def test2():
        name = "Kobe"

        def test3():

            print(name)
        return test3

    return test2
func = test1
print(func)
func()()()

七、递归调用

1.递归特性

  1.必须有一个明确的结束条件;2.进入深一层的递归,问题规模要比上一层有所减少;3.递归效率不高,递归层次过高会导致栈溢出。

(图侵删)

def calc(n):
    if int(n/2)==0:
        return n
    n = int(n/2)
    re = calc(n)
    return re
print(calc(100))

2.尾递归优化

  如阶乘函数,当所求阶乘数太大,会导致栈溢出。

def fact(n):
    if n == 1:
        return n
    return n*fact(n-1)
print(fact(100))

  尾调用就是指在一个函数的最后一步调用另外一个函数,以此来实现尾递归优化

def fact(n):
    return fact_iter(n,1);
def fact_iter(num,res):
    if num == 1:
        return res
    return fact_iter(num - 1,num*res)
print(fact(5))

  尾调用优化可以不要保存外层函数的调用记录,可以防止栈溢出,但大多数编程语言没有针对尾调用优化,Python也没有。

八、匿名函数

calc = lambda n:n**n
print(calc(10))

  匿名函数lambda主要和其他函数搭配使用

九、函数式编程

1.函数式编程

  函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。

函数式编程的一个特点是允许把函数本身作为参数传给另一个函数,还允许返回一个函数,因为Python允许使用变量,所以Python不是纯函数式编程语言。

2.高阶函数

  可以接收另外一个函数做变量的函数

def add(x,y,f):
    return (f(x)+f(y))
print(add(-1,6,abs))

  高阶函数满足两个特性:(1)传入参数是一个函数名;(2)返回值是一个函数名

3.map函数和reduce函数

(1)map函数

  接收两个参数,一个是函数,一个是可迭代对象

def f(x):
    return x*x
print(list(map(f,[1,2,3,4,5])))
L = []
for i in [1,2,3,4,5]:
    L.append(i*i)
print(L)

  相同功能可以用for实现,但map函数把运算规则抽象了,可以计算任意复杂函数。

  map函数结合匿名函数的使用

print(list(map(lambda x:x*x,range(5))))

(2)reduce函数

  把一个函数作用到一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积运算。

from functools import reduce
def f(x,y):
    return x*100+y*10
print(reduce(f,[1,2,3,4,5]))

4.filter函数

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

def is_odd(x):
    return x % 2 == 1
print(list(filter(is_odd,[1,2,3,4,5,6,7,8])))

十、内置函数

 https://docs.python.org/3/library/functions.html?highlight=built#ascii 

1.abs()  

  取绝对值

2.all() 

  把所有元素做bool运算,如果都是True则返回True

3.any()  

  把所有元素做bool运算,只要有一个是True就返回True

4.bin()/hex()/oct()

把十进制数转换成二进制/十六进制/八进制数

5.bool()  

  判断bool值

6.bytes()  

  把字符串转换成字节,需指定编码

#bytes()函数
a = bytes('abc', 'utf-8')
print(a)
b  = bytes(1)
print(b)
c = bytes([2,3,6,8])
print(c)

7.chr()/ord()  

  chr(),输入ASCII码表中的编号,输出对应字符;ord(),输入字符,显示字符对应的ASCII码表中的编号

8.dir()  

  打印某个对象下的方法

9.divmod()  

  取得商和余数,可以用在分页功能

10.enumerate()  

  遍历序列中的元素及下标

test = [11,22,33,44]
for i,j in enumerate(test):
    print(i,j)

11.eval()  

  将字符串str当成有效的表达式来求值并返回计算结果;把字符串中的数据结构提取出来

12.zip()  

  拉链

a = (1,2,3)
b = ("a","b","c")
print(list(zip(a,b))

13.max()/min()  

  求取最大值和最小值

14.pow()  

  输入两个参数是求取次幂,输入三个参数是求次幂后取余

15.reversed()    

  反转

16.round()  

  四舍五入 ,可以指定小数位

17.sorted()  

  排序

18.sum()  

  求和

19.type()  

  查看类型

20.__import__()  

  导入文件

 

posted on 2018-05-04 21:53  hechengwei  阅读(194)  评论(0编辑  收藏  举报