2020-11-15

一.实参类型

-->实参可以传递任意类型

def fn(a):

     print('a = ',a)

b = 123     #a =  123

b = True   // a =  True

b = 'python'    //a =  python

fn(b)

-->函数调用时解析器不会检查实参类型,需要注意

def f1(a,b):

     print(a + b)

f1(1,'2')

TypeError: unsupported operand type(s) for +: 'int' and 'str'

-->如果形参执行的是一个对象(列表,字典...),但我们通过形参改变对象时,会改变所有指向该对象的变量

def fn(a):

a[0] =30

    print('a = ',a, id(a))

c = [1,2,3]

fn(c) # 相当于a = c,次数a,c 是指向同一个对象

fn(c.copy())    #此时指向不同对象

print('c = ',c, id(c))

# a =  [30, 2, 3] 2360030290504

# c =  [30, 2, 3] 2360030290504

# a =  [30, 2, 3] 1828469891720

# c =  [1, 2, 3] 1828469891656

二.不定长参数

-->实参可以传递任意类型

def fn(a):

     print('a = ',a)

b = 123     #a =  123

b = True    a =  True

b = 'python'    a =  python

fn(b)

-->函数调用时解析器不会检查实参类型

def f1(a,b):

    print(a + b)

f1(1,'2')

# # TypeError: unsupported operand type(s) for +: 'int' and 'str'

-->如果形参执行的是一个对象(列表,字典...),但我们通过形参改变对象时,会改变所有指向该对象的变量

def fn(a):

a[0] =30

    print('a = ',a, id(a))

c = [1,2,3]

fn(c)       # 相当于a = c,次数a,c 是指向同一个对象

# fn(c.copy())    #此时指向不同对象

print('c = ',c , id(c))

# a =  [30, 2, 3] 2360030290504

# c =  [30, 2, 3] 2360030290504

# a =  [30, 2, 3] 1828469891720

# c =  [1, 2, 3] 1828469891656

-->在定义函数的时候,在形参前面加*,那么他就能获取所有实参,保存在元组中

    多个数的计算实例:

def f4(*args):

# print('args =',args,type(args))    //args = (1, 2, 3, 4, 5)

    r =0

    for iin args:

r += i

print(r)

# f4(1,2,3,4,5)

# 15

注意:

            1.带*的形参只能有一个,

            2.带*的形参后面只能是关键字参数,否则报错

def f5(a,b,*c):

# def f6(a,*b,c):  

def f7(a,*b,c):

    print('a = ',a)

    print('b = ',b)

    print('c = ',c)

# f5(1,2,3,4,5)

# a =  1

# b =  2

# c =  (3, 4, 5)

# f6(1,2,3,4,5)        // TypeError: f6() missing 1 required keyword-only argument: 'c'

# f7(1,2,3,4,c = 5)

a =  1

b =  (2, 3, 4)

c =  5

-->*args只能接收位置参数,

-->**keyargs可以接收关键字参数,只能有一个,且只能放在最后面

def fn8(*a):

#def fn8(**a):

print('a = ', a)

fn8(b =1,c =4,d =8)

#TypeError: fn8() got an unexpected keyword argument 'b'

a =  {'b': 1, 'c': 4, 'd': 8}

三.函数返回值

 1.直接使用函数返回值

  2.通过变量接受函数返回值

-->return 任意对象(序列,数字,字符串,布尔值..)

-->一个函数没有return,或者return后面什么都没有写,相当于return None

-->return一旦出现,后面的代码都不会执行

def fn():

    return 12

fn()

print(fn())    12      // 1.直接使用函数返回值

r = fn()

print(r)    12          // 2.通过变量接受函数返回值


四.文档字符串

仅做了解,简单代码实例:

def fn():

"""

    这是一个文档字符串

    :return:

"""

help(fn)

Help on function fnin module __main__:

fn()

这是一个文档字符串

    :return:

五.函数作用域

1.作用域:变量生效的区域

-->局部作用域

def fn():

a =1  #局部变量a,只能作用在函数内部

    print('a = ',a)

 fn()    #a =  1

print('a = ', a)    #NameError: name 'a' is not defined

-->全局作用域

b = 2  #//全局变量,可以被访问到

def fn1():

     a = 1

     print('函数内部a = ',a)

     print('函数内部b = ',b)

fn1()

print('函数外部b = ',b)

# 函数内部a =  1

# 函数内部b =  2

# 函数外部b =  2

-->可以在局部作用域的变量前面加上关键字 global,使它成为全局变量

def fn():

    global a

    a =1

    print('a = ',a)

fn()

print('a = ', a)

a =1

a =1

六.递归

递归:解决问题的思想,类似循环,但是基本不使用,在函数中自己调用自己

两个条件:

            1.基线条件:问题可以被分解为最小的问题,满足基线条件,递归不再执行

            2.递归条件:问题可以继续分解的条件

-->用递归求任意数(用户决定)的阶乘,

def fn(n):

    if n == 1:  #基线条件

        return 1

    else:

        return fn(n - 1) * n      #递归条件

print(fn(int(input('请输入阶乘数:'))))    #24

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • zabbix 5.2 配置企业微信告警(采用python脚本) centos 8 目前已经自带python 3.6...
    博客用户阅读 2,271评论 0 0
  • 添加事件和事件对象 元素.on事件名 注意:事件不可绑定多个,后面绑定的会覆盖前面的 格式:let oBtn=do...
    牛牛nhw阅读 2,350评论 0 0
  • d函数 一、函数基础 1、什么是函数? 在一个完整的项目中,某些功能会被反复使用。那么会将某段代码封装成函数,当我...
    帅气的Lucky阅读 3,025评论 0 0
  • 第五课 案例实操:函数装饰器应用 1、函数装饰器广泛应用 @staticmethod 和@classmethod ...
    但丁的学习笔记阅读 1,098评论 0 8
  • 1.集合的使用 1.1集合的操作len(),返回集合的长度。s = set('python')#s为{'p','y...
    rivulet阅读 1,482评论 0 0