Python 编程 | 连载 14 - Python 的函数

简介: Python 编程 | 连载 14 - Python 的函数

一、函数的定义

函数是:

  • 将一件事情的步骤封装在一起并得到最终结果
  • 函数名代表了这个函数要做的事情
  • 函数体是实现函数功能的流程
  • 方法或者功能
  • 可以重复利用

函数分为内置函数和自定义函数,在前面提到的各个数据类型能调用的方法都是内置函数,当内置函数无法满足我们的需求时,就需要进行自定义函数。

Python中通过关键字def来定义函数

def func_name(args..)
    todo
    返回值
复制代码

通过 函数名() 的形式来执行函数或者调用函数

函数结果的返回:

  • return 是函数结果返回的关键字
  • return 只能在函数体内使用
  • return 支持返回所有的 Python 数据类型
  • 有返回值的函数可以将返回值直接赋值给一个变量

自定义一个 capitalize 函数

def capitalize(data):
    index = 0
    # 保存新字符串
    temp = ''
    for item in data:
        # 第一次循环获取到第一个字符
        if index == 0:
            temp = item.upper()
        else:
            temp += item
        index += 1
    return temp
res = capitalize('hello')
print(res)
复制代码

b945a7e506204ce9b668d7aa3acef5c3_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

res = capitalize(123)
print(res)
复制代码

8f6bac943e0c487495004fb5164e26c1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

定义一个无返回值的函数

def message(mes, mes_type):
    new_mes = '[%s]%s' % (mes_type, mes)
    print(new_mes)
message('I am IronMan', 'info')
复制代码

ec487bb7bde843c4a729ee72ce55cf68_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

函数返回的结果为 None

res = message('Tomorrow is Friday', 'info')
print('res:%s' % res)
复制代码

d92b578978614f5badd92b0d83410e72_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

return 与 print 的区别:

  • print只是单纯的将对象打印,不支持赋值语句
  • return是对函数执行结果的返回,也支持赋值语句

二、函数的参数

函数的参数有必传参数、默认参数以及不确定参数。

必传参数与默认参数

函数中定义的参数没有默认值,在调用函数时如果不传则报错。

必传参数有以下特点

  • 函数中没有默认值,不传会报错
  • 定义函数时,参数后面没有等号进行赋值
  • 在定义函数的时候,没有默认值且必须在函数执行的时候传递进去的参数,且顺序与参数顺序相同,就是必传参数

在定义函数的时候,定义的参数含有默认值,通过赋值语句给参数一个默认的值,如果默认参数在调用函数的时候给予了新的值,函数将优先使用后传入的值。

def add(a, b, c=3):
    return a + b + c
result = add(1, 2)
print(result)
result = add(1, 2, 6)
print(result)
result = add()
print(result)
复制代码

image.png

不确定参数

不确定参数也就是可变参数:

  • 没有固定的参数名和数量,不确定传递的参数名,不确定传递的参数个数
  • *args代表将不定个数的参数合并成元组
  • **kwargs表示将有参数与默认值的语句合并成一个字典
def alpha(*args, **kwargs):
    print(args, type(args))
    print(kwargs, type(kwargs))
alpha(1, 2, 3, name='stark', address='NY')
复制代码

image.png

def bravo(*args, **kwargs):
    if len(args) > 0:
        for i in args:
            print(i)
    if 'name' in kwargs:
        print(kwargs['name'])
bravo('stark', 'peter', 'banner', 'clint', name='小明', address='上海')
复制代码

image.png

传递元组和字典类型参数

tuple_01 = (1,3,5,8,0,11)
dict_01 = {'name': 'stark', 'address':'NY'}
bravo(tuple_01, dict_01)
bravo(*tuple_01, **dict_01)
复制代码

image.png

参数规则

image.png

def alpha(x, y = 1):
    print(x + y)
# 使用位置传参
alpha(1, 2)
# 位置传参,只传必填参数
alpha(1)
# 使用关键字传参
alpha(x = 1, y = 2)
# 关键字传参,只传必填参数
alpha(x = 1)
# 关键字传参,不必遵循参数先后顺序
alpha(y = 1, x = 2)
复制代码

image.png

必填参数一定要传,否则会报错

def bravo(x, y=1, *args):
    print('x={}, y={}, args={}'.format(x, y, args))
tuple_01 = (1, 2)
bravo(1, 2, *tuple_01)
# 这种传参方式会报错
bravo(x=1, y=2, *tuple_01)
复制代码

image.png

当必传参数与默认参数与元组类型参数混用时,推荐使用位置传参

def charlie(x, y=1, **kwargs):
    print('x={}, y={}, kwargs={}'.format(x, y, kwargs))
dict_01 = {'name': 'stark', 'address': 'NY'}
charlie(1, 2, **dict_01)
# 这种传参方式会报错, 位置传参字典必须放到最后
# charlie(**dict_01, 1, 2)
charlie(x=1, y=2, name='stark', address='NY')
charlie(name='stark', address='NY', x=1, y=2)
复制代码

image.png

def delta(x, y=1, **kwargs):
    print('x={}, y={}, kwargs={}'.format(x, y, **kwargs))
dict_01 = {'name': 'stark', 'address': 'NY'}
delta(1, 2, **dict_01)
复制代码

image.png

函数体内不能加*或者**

函数参数的类型

可以对函数参数的类型进行定义,定义方式如下

image.png

  • 通过参数名:参数数据类型的方式定义参数类型
  • Python 3.7 以后的版本才可以使用
  • 不会对参数类型进行校验
def foxtrot(x:str, y:int=1):
    print('x={}, y={}'.format(x, y))
foxtrot('stark')
foxtrot('stark', 2)
foxtrot(1, 'stark')
复制代码

image.png

def golf(x:str, y:int=1, *args:int, **kwargs:str):
    print('x={}, y={}, args={}, kwargs={}'.format(x, y, args, kwargs))
golf('stark', 2, 1, 2, name='stark')
golf(1, 3, 2, 3, id=1)
复制代码

image.png

三、全局变量与局部变量

全局变量定义在Python脚本最上层代码块的变量,全局变量在函数体内可以读取,但是无法在函数体内进行修改

name = 'stark'
def hotel():
    print('函数体内打印出name的值为:', name)
hotel()
print('函数体外打印出name的值为:', name)
复制代码

image.png

在函数体内定义的变量称为局部变量,局部变量只能在当前定义的函数体内使用,函数体外无法使用

def iris():
    address = 'New York'
    print('函数体内使用局部变量:',address)
iris()
print('函数体外使用局部变量:', address)
复制代码

image.png

使用global关键字可以将全局变量在函数体内修改。

name = 'stark'
print('函数体外打印出修改前name的值为:', name)
def hotel():
    global name
    name = 'tony stark'
    print('函数体内修改name的值为:', name)
hotel()
print('函数体外再次打印出name的值为:', name)
复制代码

image.png

global 只支持数字字符串和空类型以及布尔类型,字典列表在函数体类修改是不需要 global 关键字的,不建议在函数体内使用 global 关键字修改全局变量

四、递归函数

一个函数不停的将自己反复执行,可以称之为递归函数。

count = 0
def juliet():
    global count
    count += 1
    if count != 5:
        print('count!=5时重复执行自己,当前count为:', count)
        return juliet()
    else:
        print('count:',count)
juliet()
复制代码

image.png

递归函数如果没有退出递归的条件会导致内存溢出。

五、匿名函数

lambda 可以定义一个轻量化的函数,即用即删除,很适合需要完成一项功能,但只在一处使用的情况

无参数匿名函数的定义方法

f = lambda: value
f()
复制代码

有参数匿名函数的定义方法

f = lambda x, y: x + y
f(1, 2)
复制代码
kilo = lambda: 1
res = kilo()
print(res)
复制代码

image.png

lambda 冒号后面的内容就是返回的内容,默认省略了 return 关键字,如果加上 return 关键字会报错

lima = lambda : print('I am IronMan')
lima()
复制代码

image.png

mike = lambda x, y: x * y
print(mike(9, 8))
复制代码

image.png


相关文章
|
8天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
8天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
8天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
2天前
|
存储 人工智能 数据挖掘
Python编程入门:打造你的第一个程序
本文旨在为初学者提供Python编程的初步指导,通过介绍Python语言的基础概念、开发环境的搭建以及一个简单的代码示例,帮助读者快速入门。文章将引导你理解编程思维,学会如何编写、运行和调试Python代码,从而开启编程之旅。
22 2
|
2天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
3天前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
11 1
|
10天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
5天前
|
存储 网络协议 IDE
从零起步学习Python编程
从零起步学习Python编程
|
9天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
|
9天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
下一篇
无影云桌面