2018-10-11函数相关应用

一、函数说明文档(函数描述)
def func1(a, b):
    """
    求两个数的和
    :param a: 数字,整型
    :param b: 数字,整型
    :return: 两个数的和
    """
    return a + b
func1(1, 2)

二、参数列表中,可以通过参数名:类型名,也可以通过默认值来说明参数类型

类型说明只是提示调用者应该传什么类型的数据,但并不是不能传其他类型的数据
说明类型的好处:a.能清楚知道应该传什么类型的数据,b.写代码时有相关提示
-> int :说明函数返回类型如下:

def func2(a:int, b = 0, c = '') -> int:
    """
    求两个数和
    :param a:整型数字
    :param b: 整型数字
    :return: 和
    """

    return sum(a + b)

func2(1, 2, 'a')

注意:再次强调函数声明不会执行函数体

三、不定长参数

面试题: args和kwargs的区别?
*参数名:将位置参数作为元祖的元素。参数就是一个元祖
**参数名:将关键字参数,参数名为key,实参为值组合成键值对,作为字典的元素。参数是一个字典
注意:这两种方式一般一起用,并且 参数名必须放在
参数名 的前面

def function1(*args):
    print(args)
function1(1, 2, 3)  # (1, 2, 3)

def function2(**args):
    print(args)
function2(a = 1, b = 2, c = 3)  # {'a': 1, 'b': 2, 'c': 3}

# 两种方式一般一起用

def func3(*args, **kwargs):
    print(args, kwargs)

func3(1,2)   #(1, 2) {}
func3(a = 1, b = 2, c = 3)  # () {'a': 1, 'b': 2, 'c': 3}
func3(1, 2, a = 4, b = 5, c = 6)  # (1, 2) {'a': 4, 'b': 5, 'c': 6}

四、返回值

python中所有的函数都有返回值。如果遇到return函数的返回的值就是return后面的值,没有遇到return就是None

1.匿名函数

以另一种方式声明函数

  • 格式:(声明函数)
  • 函数名 = lambda 参数列表:返回值
  • 说明
  • 函数名:就是与变量名的要求一样
  • lambda: 关键字
  • 参数列表:至少有一个参数,参数1,参数2,.....
  • 返回值:相当于只有一个return语句的函数体
  • :固定写法
    匿名函数的调用和普通函数一样:函数名(实参列表)
  • 也支持位置参数,关键字参数,参数默认值,不定长参数
sum1 = lambda a, b : a + b

print(sum1(1, 2))
  • 练习:求1+2+....+n的和
sum2 = lambda n : sum(range(n + 1))

print(sum2(100))

五、变量的作用域

指的是变量能使用的范围

1.全局变量局部变量
  • a.全局变量
    声明在函数和类的外面的都是全局变量
    作用域:从声明开始到整个py文件结束(任何地方都可以使用)

  • b.局部变量:
    声明在函数和类中的变量都是局部变量,作用域在声明函数开始函数和类结束

def fun1():
    aa = 100
    for x in range(2):
        t = x
    print(x)
    print(aa)
fun1()

print(aa) # NameError: name 'aa' is not defined

2.两个关键字
  • a.global关键字
    注意:只能在函数中使用
    **功能:i.可用于标识使用外部全局变量,ii.还可以是在函数内部声明一个全局变量
name = 'abc'
def fun2():
    global name         #
    name = 'aaa'        # 未使用global
    print(name)         # 未使用global 结果:aaa
                        # 使用global 结果:aaa
fun2()
print(name)    # 未使用global 结果:abc
print(name)    # 使用global 结果:aaa
  • b.nonlocal关键字
    想要在局部的局部中修改局部变量的值
def fun3():
    abc = 100
    def fun4():
        nonlocal abc
        abc = 200
        print(abc)
    fun4()
    print(abc)
fun3()
print(abc) # abc还是局部的

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

def fun1():
    print('abc')
print(type(fun1))   # 不加括号,加括号是调用函数获取返回值
3.函数作为列表的元素
a = 10
list1 = [1, a]
print(list1)

def fun2():
    print('我是函数')
    return 10
list2 = [1, fun2, fun2()]
print(list2)
print(list2[1]())
print(list2[2] + 100)
4. 将函数作为参数
a = 10
def fun1(n):
    print(n)
fun1(a)

def fun2(n):
    n()
def fun3(n):
    print('hello')
fun3(fun2)  # 作为参数给形参赋值
应用:

语法:list.sort(key=None, reverse=False)
使用sort的时候,可以通过给key赋一个函数变量,来规定列表中的元素标准来排序。
并且这里的函数必须要求有一个返回值

list1 = [1, 9, 2, 3, 4]
list1.sort()
print(list1)

list2 = [
    {'name': '张三', 'age': 20},
    {'name': '李四', 'age': 18},
    {'name': '小明', 'age': 22}
]
# 根据列表里面的那个元素排序
def get_age(item):
    return item['age']
# key需要传一个函数
list2.sort(key = get_age, reverse = True)
print(list2)


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

def get_factor(item):
    return item[1]

list3.sort(key=get_factor, reverse=True)
print(list3)
list3.sort(key = lambda item:item[1], reverse = True)

5.将函数作为返回值

根据运算符,返回对应的功能

def operation(operator):
    if operator == '+':
        def fun1(*args,**kwargs):
            # 求和
            sum1 = 0
            for x in args:
                sum1 += x
            for key in kwargs:
                sum1 += kwargs[key]
            return sum1
        return fun1   # 切记不要加括号
re = operation('+')(10, 20,a = 1, b = 2)
print(re)

注意:Python中的函数可以有多个返回值

练习:求多个数的和以及均值

def qf_sum(*args):
    sum1 = sum(args)
    average = sum1 / len(args)
    return sum1, average

print(qf_sum(78, 89))
6.函数的调用过程是一个压栈过程

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

六、递归函数

函数中自己调用自己,这样的函数就是递归函数
循环可做的事递归都能做,但是循环能做的事绝不选递归
如下就是一个是循环

def fun():
    print('==')
    fun()
fun()

1.怎么写递归函数

  • 第一步:确定临界值(函数结束的条件),让函数结束
  • 第二步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系
  • 第三步:根据关系,用f(n-1)实现f(n)的功能
    练习:写一个递归函数,实现:1+2+3+...n
def qf_sum(n):
    # 1.找临界值
    if n == 1:
        return 1
    """
    找关系
    qf_sum(n) = 1+2+3....n
    qf_sum(n-1) = 1+2+3+...+n-1
    qf_sum(n) = qf_sum(n-1) + n
    """
    return qf_sum(n - 1) + n
print(qf_sum(100))
练习
# 用递归实现
"""
n = 3
***
**
*
n = 4
****
***
**
*
"""
def print_star(n):
    if n == 1:
        print('*')
        return
    """
    找关系
    f(n)和f(n-1)的关系
    先打印n颗*
    在打印f(n-1)
    """
    print('*' * n)
    print_star(n-1)
print_star(5)

注意:能不用就不用,递归会突发性消耗内存

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,718评论 2 9
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,352评论 0 5
  • 1、感恩好友对我的帮助,给我解决了经济上的难关,每次在我有困难的时候都是这样义不容辞的帮我,真的好感恩她。谢谢!谢...
    雷雷222阅读 231评论 0 1