day10-函数的应用

2018-10-11  本文已影响0人  _桑心人

1.匿名函数

普通函数:
def 函数名(参数列表):
    函数体

匿名函数
函数名= lambada 参数列表:返回值

说明
函数名 -> 变量名
lambda -> 关键字
参数列表 -> 参数名1,参数名2......
返回值 -> 相当于只有一个return语句的函数体

匿名函数的调用和普通函数一样:函数名(实参列表)
也支持位置参数、关键字参数、参数设置默认值、不定长参数

代码示例

# 写一个匿名函数,功能是求两个数的和
sum1 = lambda num1, num2: num1+num2

print(sum1(10, 20))
# 相当于上面的匿名函数
#  def  sum1(num1, num2)
#      return num1+num2

运行结果

30

练习:读程序

代码如下

sum2 = lambda n: sum(range(1, n+1))
print(sum2(100))

运行结果

5050

练习:读程序

代码示例

funcs = []
for item in range(1, 5):
    funcs.append(lambda x: x*item)

print(funcs[0](2))
print(funcs[1](2))

运行结果

8
8

2.变量的作用域

1.变量的作用域
变量的作用域指的是变量能够使用的范围

2.全局变量和局部变量
全局变量:声明在函数和类的外面的变量都是全局变量;作用域是从声明开始到整个py文件结束
都可以使用

代码示例

# 全局变量
a = 10

print('=====')
for x in range(5):
    print(a)
    print(x)


def fun1():
    print(a)


fun1()

# x, y, c都是全局变量
for x in range(5):
    for y in range(2):
        c = 100

运行结果

10
0
10
1
10
2
10
3
10
4
10
3.局部变量
声明在函数和类中的变量。作用域是从声明开始到整个函数结束 

代码示例

ef fun1():
    # 局部变量
    aa = 100
    print(aa)
4.global关键字
在函数中说明一个变量是全局变量

代码示例

name = 'abc'


def func2():
    global name  # 说明当前函数中使用的name是全局变量name
    global age  # 声明一个全局变量
    age = 18
    name = 'aaa'
    print(name)


func2()
print(name)
print(age)

运行结果

aaa
aaa
18
5.nonlocal关键字
想要在局部的局部中修改局部变量的值

代码示例

def func3():
    abc = 100

    def func4():
        nonlocal abc
        abc = 200
        print('f4', abc)
    func4()
    print('f3', abc)


func3()

运行结果

f4 200
f3 200

3.函数作为变量

声明函数就是声明一个类型是function的变量,函数名实质就是变量名

代码示例

def func1():
    print('=====')


print(type(func1))

运行结果

<class 'function'>

代码示例

a = 10
b = a
print(b*10)

list1 = [1, 2]
list2 = list1
list2.append(100)
print(list1)

# 声明一个变量func2,类型为function
def func2():
    print('我是函数')


func1 = lambda x: print(x)
func3 = func1
func3(10)

a = func2
a()
# 将函数func2的返回值给b
b = func2()
print(b)

运行结果

100
[1, 2, 100]
10
我是函数
我是函数
None

代码示例

a = 10
list1 = [1, a]
print(list1, list1[1] + 100)


def func22():
    print('我又是函数')
    return 10


list2 = [1, func22, func22()]
print(list2)

# list2[1]取到一个函数,通过后面加()调用函数
print(list2[1]())

运行结果

[1, 10] 110
我又是函数
[1, <function func22 at 0x00000285157D4AE8>, 10]
我又是函数
10

代码示例

a = 10


def func1(n):
    print(n)


func1(a)


def func11(n):
    print('aaa')
    n()


def func12():
    print('hello world!')


func11(func12)

运行结果

10
aaa
hello world!

应用:sort的使用

列表.sort(key=None, reverse=False)
使用sort的时候,可以通过给key赋一个函数变量,来规定列表中的元素按照什么标准来排序
这儿的函数变量要求要有一个参数和一个返回值。参数代表列表中的元素,返回值代表按照那个
标准排序

代码示例

list1 = [1, 45, 8, 89]
list1.sort()
print(list1)

list2 = [
    {'name': '张三', 'age': 20, 'score': 90},
    {'name': '李四', 'age': 28, 'score': 100},
    {'name': '王五', 'age': 18, 'score': 89}
]


def get_score(item):  # 根据成绩排序
    return item['score']


list2.sort(key=get_score)
print(list2)

list3 = [
    ('a', 20),
    (10, 3),
    ('c', 90)
]


def get_2(item):
    return item[1]


list3.sort(key=get_2, reverse=True)
print(list3)

list3.sort(key=lambda item: item[1])
print(list3)

运行结果

[1, 8, 45, 89]
[{'name': '王五', 'age': 18, 'score': 89}, {'name': '张三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 28, 'score': 100}]
[('c', 90), ('a', 20), (10, 3)]
[(10, 3), ('a', 20), ('c', 90)]

代码示例

def operation(operator: str):   # 根据运算符号,返回对应的功能
    if operator == "+":
        def func111(*args, **kwargs):
            sum1 = 0
            for item in args:
                sum1 += item
            for key in kwargs:
                sum1 += kwargs[key]
            return sum1
        return func111
    elif operator == "*":
        def func222(*args, **kwargs):
            sum1 = 1
            for item in args:
                sum1 *= item
            for key in kwargs:
                sum1 *= kwargs[key]
            return sum1
        return func222


print(operation('+')(90, 98))
print(operation('+')(90, 98, a=2))
print(operation('*')(10, 30, a=2))
print(operation('*')(10, 30, 30, 10))

运行结果

188
190
600
90000

4.函数的调用

1.补充:python中的函数可以有多个返回值

代码示例

# 求多个数的和以及平均值


def yt_sum(*nums):
    sum1 = sum(nums)
    average = sum1 / len(nums)
    return sum1, average


a, b = yt_sum(2, 56, 78, 65, 6)
num = yt_sum(2, 56, 78, 65, 6)
print(a, b)
print(num[0], num[1])

运行结果

207 41.4
207 41.4
2.函数的调用是一个压栈的过程

每次调用函数的时候,系统都会在内存中(栈)开辟空间来存储函数执行过程中产生的数据
(函数中声明的变量)。
当函数调用完成后,这块内存会自动销毁

5.递归函数(了解)

递归函数:函数中调用函数本身,这样的函数就是递归函数(自己调用自己)

循环能做的事情递归都可以做,但是实际循环能解决的问题绝对不选递归

代码示例

def func1():
    print('=====')
    func1()
怎么些递归函数
第一步:确定临界值(循环结束的条件),让函数结束
第一步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系
第三部:根据关系,用f(n-1)实现f(n)的功能

代码示例

# 写一个递归函数,实现:1+2+3+.....n


def yt_sun(n):
    # 1.找临界值
    if n == 1:
        return 1
    # 2.找关系
    """
    yt_sum(n) = 1+2+3+...+n
    yt_sum(n-1) = 1+2+3+...+n-1
    yt_sum(n) = yt_sum(n-1)+n
    """
    return yt_sun(n-1) + n


print(yt_sun(100))

# 用递归实现一下功能
"""
n = 3
***
**
*

n = 4
****
***
**
*

......
"""


def print_star(n):
    if n == 1:
        print('*')
        return
    print('*'*n)
    print_star(n-1)


print_star(5)

"""
n = 3
*
**
***
.....
"""


def print_star(n):
    if n == 1:
        print('*')
        return
    print_star(n - 1)
    print('*' * n)



print_star(3)

运行结果

5050
*****
****
***
**
*
*
**
***

总结:能不用就不用

上一篇下一篇

猜你喜欢

热点阅读