python基础语法 005 函数1-1

news2024/9/23 19:14:24

1 函数

1.1 什么是函数

指:输入一定的数据以后,能根据里面的执行步骤,算出一些数据的值;得到相关的数据,获取对于的输出值。

存储指定功能的程序,进行相应的复用

解释:

  • 洗衣服 ==》输入值(洗衣粉,脏衣服,水) ==》(干净的衣服)

  • 橘子题:输入值:单价、重量;==》输出:价格

1.2 函数的定义

函数在python中怎么定义?怎么使用?

1) 怎么定义? 

def (空格) 函数名称(函数的参数1,参数2,参数3..):
    """文档字符串 docstring
    函数的注释,这个函数是干嘛用的,
    参数:
    返回值:    
    """
    (缩进)函数体(函数具体执行的逻辑)
    return 函数的返回值(输出)



#例子
#加法
def add(a, b):
    """两数相加"""
    c = a + b
    return c

2) 怎么使用?

#函数的调用
#a = 1, b =2
add(a = 1, b = 2)

add(1, 2)

#任何判断函数语句执行了,可以加一些日志打印如:
def add(a, b):
    """两数相加"""
    print("函数正在执行")
    c = a + b
    return c

3) 怎么获取结果?

#如何获取最后的结果?
#怎么显示
#print 和 return区别
#print:显示在屏幕上,打印出来
#return:函数运算的结果,获取结果以后不一定会打印出来,仅获取结果,需要给return在赋值一个变量,再print打印出这个变量

print(add(1, 2))


#使用变量接收
res = print(add(3, 5))
print(res )

1.3 函数的作用:

  • 实现某个指定的功能,可以重复使用
  • 提高代码的复用性,不用写很多重复代码
  • 函数还能通过命名增加可读性
  • 可以隐藏大量的逻辑
#例子:足球队招人
#当发现在复制、粘贴相同的或者类似代码的时候,则极有可能需要定义一个函数
#把同样的一段代码存储到函数当中 ===> 封装
#封装成函数(盒子)  ===》把一段代码存储到函数当中
#函数的作用:存储一段程序(有长有短),提高代码的复用性
#函数不会存储变量、数据,变量一般放在外面===》实际参数,变量一般是会变的作用
#实际参数是这样被提取出来:当封装函数的时候,通常会有一些变化的东西(数据)
#什么时候封装函数:重复使用

def join_team(age, gender):
    if (18 < age < 22) and gender == '女':
        print("请开始训练")

age = 17
gender = '男'

join_team(age, gender)

1.4 函数的参数

思考:

  • 为什么要加参数
  • 参数的个数、类型
  • 多个参数和调用的顺序

1.4.1 形式参数、实际参数、位置参数

#or_list = ['abc']
#ele = '小一'
形式参数:函数在定义的时候写的参数,没有意义只是占坑的,即变量名 or_list , ele
实际参数:函数在调用的时候写的参数,是个值                  =['abc']  ='小一'
位置参数:形式参数和实际参数要一一按照顺序对应,不多不少,位置一样

1.4.2 默认参数

默认参数:在函数定义的时候,给形式参数一个默认值,即缺省值
        如果有默认值,在函数调用时,如果位置参数一一对应,传入了实际参数,默认参数不会生效
        如果没有传入实际参数

  • 作用1:如果没有传入实际参数,则默认值会生效
  • 作用2:可以简化函数的调用过程,只需要传入少量参数就可以实现调用过程
  • 作用3:默认参数必须放到位置参数的后面

#为什么要写默认参数
def append(or_list, ele = '哇哈哈'):
    """对列表进行数据添加"""
    or_list.append(ele)
    return  or_list

print(append(['abc'], '小一')) #['abc', '小一']

###################作用2#############################3
#没有传ele,默认ele为默认值
print(append(['abc']))  #['abc', '哇哈哈']

def get_name(firstname, lastname = ''):
    return  firstname + lastname

print(get_name("周", "杰伦")) #周杰伦
print(get_name("周", )) #周

#################作用3:默认参数必须放到位置参数的后面############################3333
def get_name(firstname = '', lastname):
    return  firstname + lastname

print(get_name("周", "杰伦"))
#SyntaxError: non-default argument follows default argument
#print(append(['aaa']))   #报错,缺少位置参数ele
#TypeError: append() missing 1 required positional argument: 'ele'

#print(append(['aaa'], '小一', '小二'))  #报错,需要2个位置参数,但给了3个
#TypeError: append() takes 2 positional arguments but 3 were given

print(append('小一',['aaa'])) #报错,顺序不一样,顺序要保持一致
#AttributeError: 'str' object has no attribute 'append'

1.4.3 关键字参数:关键字参数也要放到位置参数的后面

关键字参数:

  • 作用1:还是相对于位置参数讲的,

        可以提高函数调用时的可读性,更加容易理解实际参数的意义
        关键字的名字  === 》 形式参数来的
        原因:参数多的时候,搞不清楚位置

  • 作用2:关键字参数区别位置参数:可以不按照顺序进行调用,可以交换顺序

def get_name(firstname , middle,  lastname= ''):
    return  firstname + middle +lastname

print(get_name("周", middle='最棒', lastname = "杰伦")) #周最棒杰伦

print(get_name("周", lastname = "杰伦",middle='最棒')) #周最棒杰伦

##作用3:关键字参数也要放到位置参数的后面
print(get_name( lastname = "杰伦", "周", middle='最棒')) 
#SyntaxError: positional argument follows keyword argument

1.4.4 可变长参数

  • 指明:不知道这个函数多少个参数
  • 不需要每个参数都传入,可以选择传不传
  • *, **
  • 打印时元组
  • 星号放在函数调用里面
  • 两个星号表示关键字和字典
1 ) *arg
"""
可变长参数:
表示形式:
    *names,在函数内部的表现形式:names是元组
        可以接收从函数调用的时候,多余的位置参数
    *names, 加在其他的位置参数的后面

可以只有一个 *names,可以的
"""
def get_name(firstname, *names):
    """获取名字"""
    print(firstname)
    print(names)
    return  firstname

get_name('xiaoyi')
"""结果
xiaoyi
()
"""
get_name('xiaoyi', 'good','ok')

"""结果
xiaoyi
('good', 'ok')
"""

#可变长参数放在固定参数的前面会怎么样
def get_name( *names, firstname):
    """获取名字"""
    print(firstname)
    print(names)
    return  firstname

get_name('xiaoyi', 'good','ok')

"""结果
    get_name('xiaoyi', 'good','ok')
TypeError: get_name() missing 1 required keyword-only argument: 'firstname'

"""


#有一个*names
def get_name(*names):
    """获取名字"""
    print(names)

get_name('xiaoyi', 'good','ok') #('xiaoyi', 'good', 'ok')

#有一个2个 *names
def get_name(*names, *names):
    """获取名字"""
    print(names)

get_name('xiaoyi', 'good','ok')

"""结果 
SyntaxError: invalid syntax
"""
2) **kwargs
"""
**kwargs, keyword args 关键字不定长参数
关键字参数只能放在位置参数的后面
"""

def get_name(*names, **kwargs):
    """获取名字"""
    print(names)
    print(kwargs)

get_name('xiaoyi', 'good','ok')
"""结果
('xiaoyi', 'good', 'ok')
{}
"""

get_name('xiaoyi', 'good','ok', middle = 'hello', yit = 'world')

"""结果
('xiaoyi', 'good', 'ok')
{'middle': 'hello', 'yit': 'world'}
"""

get_name('xiaoyi', 'good','ok', middle = 'hello', yit = 'world', yit = 'yyy')
"""结果
SyntaxError: keyword argument repeated: yit
"""

1.5 函数的返回值

return

  • 中止函数
  • 条件控制的中止
  • return 可以有多个,用逗号隔开,返回的格式为元组
  • 作用:拿到返回值做进一步处理
  • 默认return None,
  • 无return ,默认返回None

#函数里面return 表示函数的返回值,可以在调用函数之后通过变量进行接收
#return 知识点2:函数体遇到return就终止运行,相当于for的break
"""
return:
1,函数遇到return就终止
2、函数的返回值return,函数调用以后可以通过变量接收return值,
函数的输出数据是由return 决定的
"""

#例子:
def add(a, b):
    if a > 100:
        return  a + b
    elif a == 100:
        return  a + 2*b
    else:
        return a + 3 * b

print(add(3, 10)) #33

#例子3 if很多的时候,可以巧妙运用return的方式去终止函数
def add(a, b):
    if a > 100:
        return a + b
    return a + 3 * b

print(add(111, 10))#121

#例子4:打印None
#函数调用后得到的数据是由return决定的,
# 函数没有return,得到的数据就是None
def add(a, b):
    c = a + b


print(add(3, 10)) #None


#append
# my_list = ['abc', 'end']
# a = my_list.append('current') #这里指方法
# print(a)

#自己实现一个append
def append(or_list, ele):
    """对列表进行数据添加"""
    or_list.append(ele)
    return  or_list

print(append(['abc'], '小一'))  #['abc', '小一']

函数:一定要掌握的知识:

  • return 
  • 函数的形式参数
  • 函数的实际参数
  • 函数的位置参数
  • 默认参数:简化调用过程
  • 关键字参数:可以交换参数的顺序,并且提高可读性
  • 可变长参数

1.6 函数之间的调用 

"""
函数之间的调用,在一个函数去用另外一个函数

#eat放在congratulat也可以运行,和python运行的代码有关系

只有函数调用了才会执行缩进的代码
若把eat放在函数调用的后面,就会报错,因为eat还没定义
即调用函数之前必须把函数定义号,与函数定义的顺序无关
"""

def congratulate(name,money,food):
    """
    庆祝宴席
    :return:
    """
    print("{}宴席花了多少:{}".format(name,money))
    #请客
    eat(name, food)


def eat(name, food):
    print("{}喜欢吃食物:{}".format(name,food))

eat('xiaoyi','apple')
congratulate('小王子', 100, 'milk')

小心递归函数使用,导致死循环,函数不要相互调用,除非熟练

def get_money(date):
    get_name('xiaoyi', "wang")
    return "我在{}h号获取".format(date)

def get_name(firstname, lastname = ''):
    get_money(7)
    return firstname + lastname

print(get_money(7))

"""结果
RecursionError: maximum recursion depth exceeded

"""

最好不要自己调自己,容易造成递归错误

def get_money(date):
    print("小一")
    get_money(7)
    print("hello")
    
print(get_money(8))

#RecursionError: maximum recursion depth exceeded while calling a Python object

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1921120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【简历】兰州某大学一本硕士:面试通过率基本是为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一个一本硕士的Java简历&#xff0c;那这个简历因为学校本身&#xff0c;它是一个一本的硕士&#xff0c;我们一般认为这一本硕士&a…

数据结构之顺序存储线性表实现详解与示例(C,C#,C++)

文章目录 一、顺序存储线性表的基本概念二、顺序存储线性表的实现1、数据结构定义2、初始化3、添加元素4、访问元素5、修改元素6、删除元素7、销毁 三、示例C语言示例C#语言示例C语言示例 顺序存储线性表是一种基本的数据结构&#xff0c;它将线性表的元素按照一定的顺序存放在…

TCP协议的三次握手和四次挥手(面试)

三次握手 首先可以简单的回答&#xff1a; 1、第一次握手&#xff1a;客户端给服务器发送一个 SYN 报文。 2、第二次握手&#xff1a;服务器收到 SYN 报文之后&#xff0c;会应答一个 SYNACK 报文。 3、第三次握手&#xff1a;客户端收到 SYNACK 报文之后&#xf…

windows单机版mongodb安装

1、先从官网下载安装包官网下载地址 2.本地解压并创建目录 2.1创建data和log目录 2.2创建mongodb.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storag…

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…

143. 最长同值路径(卡码网周赛第二十五期(23年B站笔试真题))

题目链接 143. 最长同值路径&#xff08;卡码网周赛第二十五期&#xff08;23年B站笔试真题&#xff09;&#xff09; 题目描述 给定一个二叉树的 root &#xff0c;返回最长的路径的长度&#xff0c;这个路径中的每节点具有相同值。这条路径可以经过也可以不经过根节点。两个…

Wifi贴码推广怎么加入?如何提高收益

自Wifi贴码鼻祖微.火于2021年6月推出全球第一张共享WIFI贴码以来&#xff0c;wifi贴码项目便一直是有入局意向的创业者们的重点关注对象之一。在此背景下&#xff0c;以wifi贴码推广怎么加入为代表的问题更是成为了相关创业者社群中的讨论热点。 事实上&#xff0c;对于尚未入局…

端侧智能为什么有前途

年前陆续和很多小伙伴聊过端侧智能的价值&#xff0c;吹捧的、贬低的都有&#xff0c;各自也都有自己的理由。这里&#xff0c;谨作为利益相关方&#xff0c;分享一下自己对端侧智能的看法&#xff0c;尝试回答端侧智能有没有用、为什么有用和该怎么用的问题。文章不含技术干货…

Java BigInteger 类

目录 BigInteger 1. 如何获取一个BigInteger类型的对象&#xff1f; &#xff08;1&#xff09;构造方法 &#xff08;2&#xff09;静态方法 2. 常用方法 BigInteger 可以用来表示很大很大的数&#xff0c;有多大都可以。通过创建对象调用相应的方法。详见&#xff1a;…

2024年高职云计算实验室建设及云计算实训平台整体解决方案

随着云计算技术的飞速发展&#xff0c;高职院校亟需构建一个与行业需求紧密结合的云计算实验室和实训平台。以下是针对2024年高职院校云计算实验室建设的全面解决方案。 1、在高职云计算实验室的建设与规划中&#xff0c;首要任务是立足于云计算学科的精准定位&#xff0c;紧密…

文章范冰冰高调官宣入驻TikTok!“跨境“的风最终刮到了娱乐圈

在当前的跨境电商行业&#xff0c;我们正见证一个“多元化”时代的到来。特别是最近从国内聚光灯中消失好几年的范冰冰&#xff0c;迅速成为了跨境电商行业的焦点。 范冰冰宣布正式入驻 TikTok&#xff0c;希望为自己的美妆品牌 Fan Beauty Diary&#xff0c;铺开一条新路。 …

【逆向基础】十、工具分享之DIE(Detect It Easy)

一、简介 DIE&#xff08;Detect It Easy&#xff09;是一款可以轻松检测PE文件的程序&#xff1b;其主要作用是查壳&#xff0c;并将pe文件的内容解析出来&#xff0c;包括PE文件中包含的导入函数、导出函数的名称及地址&#xff0c;入口函数地址等&#xff0c;是技术人员分析…

A Low-Latency Metadata Service for Geo-Distributed File Systems——论文泛读

Journal of Systems Architecture 2022 Paper 分布式元数据论文阅读笔记整理 问题 地理分布式文件系统已被web服务广泛使用&#xff0c;但访问不同地理位置的服务器延迟不同&#xff0c;当用户访问远程服务器时&#xff0c;将出现不可容忍的服务延迟。目前的大多数分布式文件…

华为认证试题有题库吗?华为认证题库怎么领取?

在竞争激烈的就业环境下&#xff0c;若你拥有华为认证将可以提高个人综合能力&#xff0c;更好的适应行业变化。相信大家都有听说过想考取华为初级认证并不困难&#xff0c;因为它有专门的题库供考生备考。 那么&#xff0c;到底华为认证试题有题库吗?华为认证题库要怎么领取…

Spring中的适配器模式和策略模式

1. 适配器模式的应用 1.1适配器模式&#xff08;Adapter Pattern&#xff09;的原始定义是&#xff1a;将一个类的接口转换为客户期望的另一个接口&#xff0c;适配器可以让不兼容的两个类一起协同工作。 1.2 AOP中的适配器模式 在Spring的AOP中&#xff0c;使用Advice&#…

DP V2.1a标准学习(二)

三、线材&连接器要求 1.线材分类 线材按照支持速率的不同,划分为不同规格,具体如下: DP和USB线材混用矩阵,也就是不同规格的线材对应的支持传输速率和传输类型,如下: 2.线材和连接器组件分类 线材+连接器组件分类与DP V1.4类似,不过型号更多了,如下: 也支持2种…

ss工具dump出vsock 端口号异常分析

端口冲突时&#xff0c;会出现bind fail异常&#xff0c;这时可以用ss --vsock -pl命令dump出所有listen状态的vsock,但实际发现传入的9000端口&#xff0c;dump出来却是10275&#xff0c;如下图&#xff1a; 难道是内核把端口改了&#xff1f;分析内核态源码&#xff0c;ss最终…

SW - 将面导出为dxf

文章目录 SW - 将面导出为dxf概述笔记原点问题END SW - 将面导出为dxf 概述 在做PCB板框. 以前做过一个笔记&#xff0c;用autoCAD来制作导出dxf(cadence SPB17.4 - 用autoCAD2022画一个PCB板框)。 不喜欢用autoCAD&#xff08;相对麻烦&#xff09;, 还是喜欢用SW&#xff0…

js 中 new Worker 报错 Failed to construct ‘Worker‘

new Worker("worker.js");运行多线程 Web Worker 的时候报错 Uncaught DOMException: Failed to construct ‘Worker’ 原因是浏览器不允许通过本地文件访问使用Web Worker。 解决方法&#xff1a; 将项目部署到服务器上或者用Node起本地服务访问项目

从本地到全局:基于图的RAG方法进行查询聚焦原理摘要

摘要 使用检索增强生成&#xff08;RAG&#xff09;从外部知识源检索相关信息&#xff0c;使大型语言模型&#xff08;LLMs&#xff09;能够回答有关私有和/或以前未见过的文档集合的问题。然而&#xff0c;当针对整个文本文档库提出全局问题时&#xff0c;例如“数据集中的主…