美文网首页
day10-函数的应用

day10-函数的应用

作者: 丿Rem丶 | 来源:发表于2018-10-12 10:18 被阅读0次

一、匿名函数

1.基本知识

  • 字面量:
    函数名 = lambda 参数列表:返回值

  • 说明:

    • 函数名 -> 变量名

    • lambda -> 关键字

    • 参数列表 -> 参数名1, 参数名2...

    • : -> 固定的

    • 返回值 -> 相当于只有一个return语句的函数体

  • 例子:

sum1 = lambda num1=10, num2=3: num1+num2

print(sum1(10, 20))
print(sum1(num1=100, num2=200))
print(sum1())

sum11 = lambda *nums: sum(nums)
print(sum11(1, 2, 3))
#30
#300
#13
#6

2.应用

  • 读程序:
funcs = []
for item in range(1, 5):
    funcs.append(lambda x: x*item)
print(item)

"""
item = 1 ~ 4
item = 1  [lambda x: x*item]
item = 2  [lambda x: x*item, lambda x: x*item]
item = 3  [lambda x: x*item, lambda x: x*item, lambda x: x*item]
item = 4  [lambda x: x*item, lambda x: x*item, lambda x: x*item, lambda x: x*item]
"""
print(funcs[0](2))  # 2*4   8
print(funcs[1](2))  # 2*4   8


二、变量作用域

1.作用域

  • 定义:
    变量的作用域指的是变量能够使用的范围

2.全局变量

  • 定义:
    声明在函数和类的外面的变量都是全局变量

  • 作用域:
    作用域是从声明开始,到整个py文件结束(任何地方都可以使用)

  • 例子:

a = 10

# x和b都是全局变量
for x in range(5):
    b = 10
    print(x)

3.局部变量

  • 定义:声明在函数和类中的变量都是局部变量

  • 作用域:声明在函数的局部变量,作用域是从声明开始到整个函数结束

  • 例子:

def fun1():
    # 局部变量
    aa = 100
    print(aa, a1)
    for xx in range(5):
        print(aa+xx)

4.global关键字

  • 定义:
    在函数中说明一个变量是全局变量

  • 注意:
    只能在函数中使用

  • 例子:

name = 'abc'


def func2():
    global age
    age = 18

    global name    # 说明当前函数中使用的name是全局变量name
    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

三、函数做变量

1.定义

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

2.作用

  • a.给其他变量赋值
def func11():
    print('我是函数')
# 用一个函数给变量a赋值,a也是一个函数
a = func11
a()
print(a)
#我是函数
#<function func11 at 0x0000024629456048>
  • b.作为列表的元素
def func22():
    print('我又是函数')
    return 10

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

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

# list2[2]取到的是整数10
print(list2[2]+100)

#[1, 10] 110
#我又是函数
#[1, <function func22 at 0x000002462B11FAE8>, 10]
#我又是函数
#10
#110
  • c.将函数作为参数
list2 = [
    {'name': '张三', 'age': 20, 'score': 90},
    {'name': '李四', 'age': 28, 'score': 70},
    {'name': '王五', 'age': 18, 'score': 89}
]
# 根据成绩排序
# def get_age(item):
#     return item['score']
# list2.sort(key=get_age)
list2.sort(key=lambda item: item['score'])
print(list2)
#[{'name': '李四', 'age': 28, 'score': 70}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '张三', 'age': 20, 'score': 90}]

list3 = [
    ('a', 20),
    (10, 3),
    ('b', 90)
]
# def second(item):
#     return item[1]
# list3.sort(key=second, reverse=True)
# print(list3)

list3.sort(key=lambda item: item[1])
print(list3)
#[(10, 3), ('a', 20), ('b', 90)]

四、函数调用在内存中的影响

1.定义

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

五、递归函数

1.基本知识

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

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

2.递归函数的声明

  • 声明步骤:

    • 第一步:确定临界值(循环结束的条件), 让函数结束

    • 第二步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系

    • 第三步:根据关系,用f(n-1)实现f(n)的功能

  • 例子:

"""
yt_sum(5)  n=5  5!=1   return yt_sum(4)+5
yt_sum(4)  n=4  4!=1   return yt_sum(3) + 4
yt_sum(3)  n=3  3!=1   return yt_sum(2) + 3
yt_sum(2)  n=2  2!=1   return yt_sum(1) + 2
yt_sum(1)  n=1  1==1   return 1
"""
# 写一个递归函数,实现:1+2+3+...n
def yt_sum(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
    """
    # 3.用f(n-1)实现f(n)的功能
    return yt_sum(n-1) + n


print(yt_sum(5))
#15

作业

  1. 写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表自带的逆序函数)
ljk_reverse = lambda  list1: list1[::-1]
print(ljk_reverse([1,2,3]))
#[3, 2, 1]
  1. 写一个函数,提取出字符串中所有奇数位上的字符
ljk_odd = lambda  str1: str1[1::2]
print(ljk_odd('ljkhhh'))
#jhh
  1. 写一个匿名函数,判断指定的年是否是闰年
def ljk_bissextile_year(year:int):

    if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
        print('是闰年')
    else:
        print('不是闰年')
ljk_bissextile_year(1800)
ljk_bissextile_year(2000)
#不是闰年
#是闰年
  1. 使用递归打印:
n = 3的时候   
   @    
  @@@  
 @@@@@ 
 
n = 4的时候: 
    @
   @@@
  @@@@@
 @@@@@@@

x = 0
def print_star(n):
    global x
    x += 1
    if n == 1:
        print((x-n)*' '+'@'+(x-n)*' ')
        return
    print_star(n-1)
    m =  2 * n - 1
    print((x-n)*' '+'@' * m+(x-n)*' ')
print_star(4)

#   @   
#  @@@  
# @@@@@ 
#@@@@@@@
  1. 写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。
def ljk_seq(n = 10):
    if n ==1 or n ==2:
        return 1
    return ljk_seq (n-1) +  ljk_seq(n-2)
print(ljk_seq())
#55
  1. 写一个函数,获取列表中的成绩的平均值,和最高分
def ljk_score(list1:list):
    list1.sort()
    print('最高分:',list1[-1])
    count = 0
    for x in list1:
        count += x
    print('平均值:',count/len(list1))
ljk_score([18,54,77,22,99,23,100,66])
#最高分: 100
#平均值: 57.375
  1. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新的列表返回给调用者
def ljk_check(data1):
    list1 = []
    for x in data1[1::2]:
        list1.append(x)
    return list1
print(ljk_check((1, 2, 3, 4, 5)))
#[2, 4]
  1. 实现属于自己的字典update方法:用一个字典去更新另一个字典的元素(不能使用自带的update方法)
    yt_update(字典1, 字典2)
def ljk_update(dict1:dict,dict2:dict):
    for key in dict2:
        dict1[key]=dict2[key]
    return dict1
dict1={"name":"哈哈哈","age":22}
dict2={"age": 15,"school":"清华"}
print(ljk_update(dict1,dict2))
#{'name': '哈哈哈', 'age': 15, 'school': '清华'}
  1. 实现属于自己的items方法:将字典转换成列表,字典中的键值对转换成元祖。(不能使用items方法)
    yt_items(字典)
    例如:{'a': 1, 'b':2, 'c':3} ---> [('a', 1), ('b', 2), ('c', 3)]
def ljk_items(dict1:dict):
    list1=[]
    for key in dict1:
        x=(key,dict1[key])
        list1.append(x)
    return list1
print(ljk_items({"name":"哈哈哈","age":22}))
#[('name', '哈哈哈'), ('age', 22)]

相关文章

  • day10-函数的应用

    1.匿名函数 代码示例 运行结果 练习:读程序 代码如下 运行结果 练习:读程序 代码示例 运行结果 2.变量的作...

  • day10-函数的应用

    一、匿名函数 1.普通函数 def 函数名(参数列表):函数体 2.匿名函数 函数名 = lambda 参数列表:...

  • Day10-函数的应用

    一、匿名函数 1.普通函数: def 函数名(参数列表): 函数体 2.匿名函数: 函数名 = lambda 参数...

  • day10-函数的应用

    一、匿名函数 1.基本知识 字面量:函数名 = lambda 参数列表:返回值 说明:函数名 -> 变量名lamb...

  • day10-函数的应用-作业

    1.写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表...

  • 21天E战到底学习笔记Day10

    21天E战到底学习笔记Day10-认识函数 今天的学习内容是认识函数,Excel中是得函数者得天下,那函数这一...

  • day10-日常笔记(函数的应用)

    函数的高级使用 匿名函数 1.什么是匿名函数 匿名函数还是函数,只是声明的格式和普通函数不一样。只适用于函数功能比...

  • day10-函数

    函数的调用过程:回到函数声明的位置,用实参给形参赋值(传参)执行函数体,返回值,回到函数调用位置 压栈调用函数的时...

  • day10-函数

    一.变量的作用域 含义变量在程序中能够使用的范围 全局变量a.声明在函数或者类的外部的变量都是全局变量b.全局变量...

  • day10-函数总结

    02-变量的作用域 1.变量的作用域 变量在程序中能使用的范围 1.全局变量 声明在函数或者类的外部的变量都是全局...

网友评论

      本文标题:day10-函数的应用

      本文链接:https://www.haomeiwen.com/subject/qtkiaftx.html