代码详解Python的函数基础(2)

 更新时间:2022年01月25日 11:58:10   作者:FUXI_Willard  
这篇文章主要为大家详细介绍了Python的函数基础,使用了函数参数和递归函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1.函数参数

# 1.位置参数:调用函数时,传入的值需要按照位置顺序传入
# 实例:求x的n次方
def xPowN(x,n):        # 传入的值按照x,n的位置顺序传入
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
print("2的5次方的值为:",xPowN(2,5))
print("5的2次方的值为:",xPowN(5,2))
# 结果输出:
# 2的5次方的值为: 32
# 5的2次方的值为: 25
# 2.默认参数
# 实例:求x的n次方
def xPowN(x,n = 2):        
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
print("2的5次方的值为:",xPowN(2,5))      # 当n有新的值传入,则使用新值计算,如果没有,则默认
print("5的2次方的值为:",xPowN(5))        # n的值默认为2
print("---------------------------")
print("---------------------------")
# 设置默认参数的注意事项:
# 1.必选参数在前,默认参数在后;
# 2.当函数有多个参数时,把变化大的参数放在前面,变化小的参数放在后面;
# 变化小的参数可以作为默认参数;
# 3.使用默认参数可以降低调用函数的难度;
# 4.定义默认参数时,默认参数必须指向不变对象,如果是可变对象,则出现问题,如:list
# 实例:学生信息登记
def studentInfo(name,gender,age,city = "Shenzhen"):
    print("学生的名字为:",name)
    print("学生的性别为:",gender)
    print("学生的年龄为:",age)
    print("学生来自的城市为:",city)

print("同学1的信息如下:")
print("-----------------------------")
studentInfo("Willard","男",18)                # 使用默认参数Shenzhen
print("*****************************")
print("同学2的信息如下:")
print("-----------------------------")
studentInfo("ChenJD","女",18,"Maoming")        # 传入新的参数Maoming替换Shenzhen

 # 结果输出:
2的5次方的值为: 32
5的2次方的值为: 25
---------------------------
---------------------------
同学1的信息如下:
-----------------------------
学生的名字为: Willard
学生的性别为: 男
学生的年龄为: 18
学生来自的城市为: Shenzhen
*****************************
同学2的信息如下:
-----------------------------
学生的名字为: ChenJD
学生的性别为: 女
学生的年龄为: 18
学生来自的城市为: Maoming

# 3.可变参数:传入的参数个数是可变的,可以是0、1、2到任意个
# 传统方式传入参数时,可以以list或tuple传入
# 实例(传统方式):
def sumOfN(intNumbers):
    sum = 0
    for n in intNumbers:
        sum = sum + n
    return sum
print("前100项累加和为:",sumOfN(range(101)))
print("前50项累加和为:",sumOfN(range(51)))
print("任意项累加和为:",sumOfN([1,2,5,6,7,8,9,10]))
print("任意项累加和为:",sumOfN((1,2,3,4,5,7,8,9,12)))
print("---------------------------------------------------------")
# 可变参数:在参数前添加*号
def sumOfN(*intNumbers):
    sum = 0
    for n in intNumbers:
        sum = sum + n
    return sum

print("任意项累加和为:",sumOfN(1,2,3,4,6,7,8,9))
print("任意项累加和为:",sumOfN(1,2,4))
print("任意项累加和为:",sumOfN(3,4,5,6,7))
print("---------------------------------------------------------")
# 把list或tuple作为可变参数传入
def sumOfN(*intNumbers):
    sum = 0
    for n in intNumbers:
        sum = sum + n
    return sum
# 已经有list,*nums表示把nums的所有元素作为可变参数传入
nums = [1,2,3,5]
print("传入一个list:",sumOfN(*nums))    

 # 结果输出:
前100项累加和为: 5050
前50项累加和为: 1275
任意项累加和为: 48
任意项累加和为: 51
---------------------------------------------------------
任意项累加和为: 40
任意项累加和为: 7
任意项累加和为: 25
---------------------------------------------------------
传入一个list: 11

# 4.关键字参数
# 可变参数允许传入任意个参数,这些可变参数在函数调用时自动组装为一个tuple;
# 关键字参数允许传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict;
def personInfo(name,age,**kw):
    print("name:",name,"age:",age,"other:",kw)

print("Willard个人信息:")
personInfo("Willard",18)
print("------------------------------------------------------------------")
print("Willard更详细的个人信息:")
personInfo("Willard",18,gender = "男",job = "Enginner")
print("------------------------------------------------------------------")
print("ChenJD个人信息:")
personInfo("ChenJD",18,gender = "女")
print("------------------------------------------------------------------")
# 关键字参数:可以扩展函数的功能
# Eg:用户注册功能,用户名和年龄是必填信息,其他信息均为可选
# 可以先组装出dict,然后把dict转换为关键字参数传入
extraInfo = {"gender":"Man","city":"Shenzhen","job":"Engineer"}
print("hackerLuo个人信息如下:")
personInfo("hackerLuo",18,gender = extraInfo["gender"],job = extraInfo["job"])
print("------------------------------------------------------------------")
# 使用简化写法
print("简化写法传入hackerLuo个人信息:")
personInfo("hackerLuo",18,**extraInfo)

 # 结果输出:
Willard个人信息:
name: Willard age: 18 other: {}
------------------------------------------------------------------
Willard更详细的个人信息:
name: Willard age: 18 other: {'gender': '男', 'job': 'Enginner'}
------------------------------------------------------------------
ChenJD个人信息:
name: ChenJD age: 18 other: {'gender': '女'}
------------------------------------------------------------------
hackerLuo个人信息如下:
name: hackerLuo age: 18 other: {'gender': 'Man', 'job': 'Engineer'}
------------------------------------------------------------------
简化写法传入hackerLuo个人信息:
name: hackerLuo age: 18 other: {'gender': 'Man', 'city': 'Shenzhen', 'job': 'Engineer'}

# 5.命名关键字参数
# 函数调用者可以传入任意不受限制的关键字参数;
# 传入了哪些参数,需要在函数内通过kw检查;
def personInfo(name,age,**kw):
    if "city" in kw:
        pass
    if "job" in kw:
        pass
    print("name:",name,"age:",age,"other:",kw)
    
# 如果要限制关键字参数的名字,可以用命名关键字参数
# 只接收gender,job作为关键字参数
# 命名关键字参数需要*作为分隔符,*后面的参数视为命名关键字参数
# 命名关键字参数必须传入参数名
def personInfo(name,age,*,gender,job):
    print(name,age,gender,job)

# 调用方式:
print("命名关键字参数调用!")
personInfo("Willard",18,gender = "男",job = "Engineer")
print("------------------------------------------------------------------")
# 如果函数定义中已经有一个可变参数,则后面跟着命名关键字参数不需要*分隔符
def personInfo(name,age,*args,gender,job):
    print(name,age,args,gender,job)
    
# 命名关键字参数的缺省值
def personInfo(name,age,*,gender,job = "Engineer"):
    print(name,age,gender,job)
    
print("命名关键字参数有缺省值!")
personInfo("Willard",18,gender = "男")

# 结果输出:
命名关键字参数调用!
Willard 18 男 Engineer
------------------------------------------------------------------
命名关键字参数有缺省值!
Willard 18 男 Engineer 

# 6.参数组合
# 常用参数:必选参数、默认参数、可变参数、关键字参数、命名关键字参数
# 参数定义顺序:必选参数、默认参数、可变参数、命名关键字参数、关键字参数
def egFunc1(name,age,gender = "男",*args,**kw):
    print("name:",name,"age:",age,"gender:",gender,"args:",args,"kw:",kw)
def egFunc2(name,gender = "男",*,job,**kw):
    print("name:",name,"gender:",gender,"job:",job,"kw:",kw)
    
# 调用
print("egFunc1传入name和age参数:")
egFunc1("Willard",18)
print("------------------------------------------------------------------")
print("egFunc1传入name,age,gender参数:")
egFunc1("ChenJD",18,"女")
print("------------------------------------------------------------------")
print("egFunc1传入name,age,gender,args参数:")
egFunc1("hackerLuo",18,"男",170,60)
print("------------------------------------------------------------------")
print("egFunc1传入name,age,gender,args,kw参数:")
egFunc1("Willard",18,"男",170,60,job = "Engineer")
print("------------------------------------------------------------------")
print("egFunc2传入name,gender,job,kw参数:")
egFunc2("Willard",job = "Engineer",ext = None)
print("------------------------------------------------------------------")
print("egFunc1通过tuple和dict传入参数:")
args = ("Willard",18,"男",170,60)
kw = {"job":"Engineer"}
egFunc1(*args,**kw)

# Tips:
# 1.默认参数一定要用不可变对象,如果是可变对象,程序运行时出现逻辑错误;
# 2.*args是可变参数,args接收的是一个tuple;
# 3.**kw是关键字参数,kw接收的是一个dict;
# 4.可变参数可以直接传入:func(1,2,3,4),也可以先组装list或tuple,
# 通过*args传入:func(*(1,2,3,4));
# 5.关键字参数可以直接传入:func(a = 1,b = 2),也可以先组装dict,
# 通过**kw传入:func(**{"a":1,"b":2});
# 6.命名关键字参数在没有可变参数的情况下需要写分隔符*

# 结果输出:
egFunc1传入name和age参数:
name: Willard age: 18 gender: 男 args: () kw: {}
------------------------------------------------------------------
egFunc1传入name,age,gender参数:
name: ChenJD age: 18 gender: 女 args: () kw: {}
------------------------------------------------------------------
egFunc1传入name,age,gender,args参数:
name: hackerLuo age: 18 gender: 男 args: (170, 60) kw: {}
------------------------------------------------------------------
egFunc1传入name,age,gender,args,kw参数:
name: Willard age: 18 gender: 男 args: (170, 60) kw: {'job': 'Engineer'}
------------------------------------------------------------------
egFunc2传入name,gender,job,kw参数:
name: Willard gender: 男 job: Engineer kw: {'ext': None}
------------------------------------------------------------------
egFunc1通过tuple和dict传入参数:
name: Willard age: 18 gender: 男 args: (170, 60) kw: {'job': 'Engineer'}
 

2.递归函数

# 在函数内部,可以调用其他函数,亦可以调用函数本身,则为递归函数
# 计算阶乘:n!=1×2×3...×n
def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)

print("5的阶乘为:",fact(5))
print("100的阶乘为:",fact(50))
# print("10000的阶乘为:",fact(10000))   
# print("10000的阶乘为:",fact(10000))    # 栈溢出
# 在计算机中,函数调用是通过栈数据结构实现,每进入一个函数调用,
# 栈会加一层栈帧,当函数返回,栈减少一层栈帧,递归调用次数过多,会导致栈溢出;
# 读者尝试fact(1000),fact(10000),可能fact(1000)就已经栈溢出,
# 笔者测试fact(1000)还是可以正常输出的,fact(10000)栈溢出

# 结果输出:
5的阶乘为: 120
100的阶乘为: 30414093201713378043612608166064768844377641568960512000000000000

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Python SqlAlchemy动态添加数据表字段实例解析

    Python SqlAlchemy动态添加数据表字段实例解析

    这篇文章主要介绍了Python SqlAlchemy动态添加数据表字段实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python实现图片批量剪切示例

    python实现图片批量剪切示例

    这篇文章主要介绍了python实现图片批量剪切示例,需要的朋友可以参考下
    2014-03-03
  • Python实现FTP文件传输的实例

    Python实现FTP文件传输的实例

    在本篇文章里小编给各位分享的是关于Python实现FTP文件传输的实例以及相关代码,需要的朋友们学习下。
    2019-07-07
  • python web框架Flask实现图形验证码及验证码的动态刷新实例

    python web框架Flask实现图形验证码及验证码的动态刷新实例

    在本篇文章里小编给大家整理的是关于python web框架Flask实现图形验证码的相关知识点,有需要的朋友们参考下。
    2019-10-10
  • python在非root权限下的安装方法

    python在非root权限下的安装方法

    下面小编就为大家分享一篇python在非root权限下的安装方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • python深入讲解魔术方法

    python深入讲解魔术方法

    所谓魔法函数(Magic Methods),是Python的⼀种⾼级语法,允许你在类中⾃定义函数(函数名格式⼀般为__xx__),并绑定到类的特殊⽅法中。⽐如在类A中⾃定义__str__()函数,则在调⽤str(A())时,会⾃动调⽤__str__()函数,并返回相应的结果
    2022-06-06
  • Python学习笔记之列表和成员运算符及列表相关方法详解

    Python学习笔记之列表和成员运算符及列表相关方法详解

    这篇文章主要介绍了Python学习笔记之列表和成员运算符及列表相关方法,结合实例形式详细分析了Python列表相关的概念、原理、成员函数与相关使用技巧,需要的朋友可以参考下
    2019-08-08
  • Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式

    这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • python爬取网站数据保存使用的方法

    python爬取网站数据保存使用的方法

    这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文
    2013-11-11
  • PyTorch中的torch.cat函数基本用法详解

    PyTorch中的torch.cat函数基本用法详解

    在PyTorch中,torch.cat是一个非常实用的函数,用于将多个张量(Tensor)沿指定维度连接起来,本文将详细介绍torch.cat函数的用法,并通过一些示例来说明其应用,感兴趣的朋友跟随小编一起看看吧
    2024-08-08

最新评论