• Python进阶【第四篇】函数


    一、变量

    变量是记录一系列状态变化的量

    1.变量分为可变类型与不可变类型——可变 与不可变是根据变量在内存中占据的位置

    可变类型:列表list[ ]、字典dicta{ }

    不可变类型:字符串str、数字int、元组()

    2.按照访问方式可分为顺序访问、映射访问和直接访问

    直接访问:数字int

    映射访问:字典dict{ }

    顺序访问:字符串str、列表list[ ]、元组()

    二、集合

    特征:由不同的元素组成,元素无序,集合中的元素必须是不可变类型

    1.集合定义:set()

    s = set('hello')
    print(s)
    #输出结果为{'o','h','l','e'},无序,无重

     其中()中必须为可迭代类型

    2.常用方法

    • 添加元素
    add() #向集合中添加元素
    
    •  清空集合
    clear() #清空集合
    
    •  删除集合中的元素
    pop()#随机删除某个元素
    remove()#指定某个值删除,当不存在要删除的元素时,编译报错
    discard()#指定某个值删除,当不存在要删除的元素时,编译不报错
    

     3.常用操作

    • 求交集
    s1.intersection(s2) #求s1与s2的交集
    
    •  求并集
    s1.union(s2) #求s1与s2的并集
    
    •  求差集
    s1.difference(s2) #s1中有,s2中没有的元素
    
    s2.difference(s1) #反之
    
    •  判断
    s1.difference_update(s2)  #等价于s1 = s1-s2
    
    s1.isdisjoint(s2)  #交集是否为空集
    
    s1.issubset(s2)  #s1是否为s2的子集,反之,issuperset()判断是否为父集
    

     三、字符串格式化

    %s固定类型,用于传值,传多个值是(,,,),中间用逗号分隔

    %d——传数字,%s——可用于传一切数据类型

    打印浮点数:

    %.2f  #打印小数点后2位
    

     打印百分号:%%

    字典的传值:

    %(name)d     %(age)s  #传一个字典,key=name,key=age
    

     四、函数

    形式:

    def    test()
    关键字 函数名 形参
        代码块
        return
        返回值
    

    函数的定义主要有如下要点:

    • def:表示函数的关键字
    • 函数名:函数的名称,日后根据函数名调用函数
    • 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...
    • 参数:为函数体提供数据
    • 返回值:当函数执行完毕后,可以给调用者返回数据。

     关于返回值:

    • 无返回值:返回一个None
    • 有一个返回值:返回object
    • 多个返回值:返回一个tuple

    函数的有三中不同的参数:

    • 普通参数
    • 默认参数
    • 动态参数
    # ######### 定义函数 ######### 
    
    # name 叫做函数func的形式参数,简称:形参
    def func(name):
        print name
    
    # ######### 执行函数 ######### 
    #  'wupeiqi' 叫做函数func的实际参数,简称:实参
    func('无名')
    
    普通参数
    
    def func(name, age = 18):
        
        print "%s:%s" %(name,age)
    
    # 指定参数
    func('无名', 19)
    # 使用默认参数
    func('有名')
    
    注:默认参数需要放在参数列表最后
    
    默认参数
    

     参数的传值时位置参数,关键字参数的使用规则:

    • 位置参数必须一一对应,缺一不行,多一也不行
    • 一个参数不能传两个值
    • 若位置参数与关键字参数混合使用,则位置参数必须在关键字参数左边
    • 多组参数(位置参数,*args,**kwargs)对应形式为(位置参数,列表,字典)

    五、局部变量与全局变量

    局部变量;在子程序中定义的变量

    全局变量;在整个文件中任何位置均可调用到

     变量使用的就近原则

    关于global关键字:

    如果函数中无global关键字,优先读取局部变量,若无局部变量,则只能读取全局变量,也就无法对其赋值或者修改。

    当有global关键字时,global把全局变量拿到函数中,变成了该函数的变量,但对其他函数来讲,仍然是全局变量,但全局变量的值可以在上一个函数中被修改。

    为了以后避免变量重名问题,全局变量一律大写,局部变量小写。

    函数执行顺序

    六、递归

    函数自己调用自己,但必须有个明确的结束条件。

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

    举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出:

    fact(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = fact(n-1) x n

    所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。

    于是,fact(n)用递归的方式写出来就是:

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

     递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

    尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

    尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出

     

  • 相关阅读:
    POJ 2342.Anniversary party-树形dp
    Codeforces Round #363 (Div. 2) A、B、C
    Codeforces Beta Round #17 D.Notepad 指数循环节
    hdu 5920 Wool 思路
    hdu 5719 Arrange 贪心
    hdu 5718 Oracle 高精度
    hiho #1332 : 简单计算器 栈+递归
    UESTC 1074 秋实大哥搞算数 栈模拟
    cdoj 1329 卿学姐与魔法 优先队列
    cdoj 1324 卿学姐与公主 线段树裸题
  • 原文地址:https://www.cnblogs.com/bep-feijin/p/8681232.html
Copyright © 2020-2023  润新知