龙空技术网

Python零基础一周学(7)——Python 中的函数

蓝衫科技 211

前言:

此刻你们对“python的src”大体比较注重,各位老铁们都需要分析一些“python的src”的相关文章。那么小编也在网摘上网罗了一些有关“python的src””的相关文章,希望朋友们能喜欢,咱们快快来了解一下吧!

学习大纲

学习目标

要达到的水平

第一个 Python 程序

会输出文字

变量类型初识

会创建字符串和数字这两种变量类型并学会数字运算的方法

条件语句

掌握三个关键字:if elif 和 else,并能用它们控制代码执行方向

常用的字符串操作

掌握对字符串进行切片,追加等操作

四大常用类型的操作

掌握这4种内置类型(list、tuple、dict 、set)的增删查改操作

循环语句

掌握 while 和 for 这两种循环方式

函数

掌握创建和调用函数的方法

文件操作

掌握文件的读写方法

掌握创建和使用类的方法

当前学习进展: 函数

下一期: 文件操作

PS:本文转载自

@顺手牵羊

开始之前

本专栏下的代码绝大多数是 python 代码(除非特地说明),所以需要大家在学习之前安装一下 python 环境,如果没有安装的话,建议参考我之前特地写的一篇 python 及代码编辑器的安装教程

环境搭建

概要

在前面的一系列文章中,有做过归纳的读者不难发现,我们所写的代码有一个特点,那就要解决一个问题时,会直接根据已有的数据进行一系列的操作处理过程,最后得以解决问题。 这么做当然是没有错误的。但是,若是我们处理一个问题的过程很繁琐,那一气呵成地写完代码是有难度的。如果我们把解决问题的过程细化为几个模块,给它们各自的分工,专业的人去干专业的事情,再把它得到的结果返回,这样子若别人想实现相应的功能的时候只需要按规范提供一些数据,即可得到需要的结果,而无需关注实现过程。本篇文章将带领大家学习函数的创建以及调用方法以为后续代码的健壮性和可维护性奠定基础。

正文

举个例子,假设你想买一款手机,但你对于手机等相关知识所知甚少,那么这个时候,你可能会告诉卖手机的人(函数),说“我想买手机”(参数),接着让他给你推荐手机(调用函数),之后卖手机的再利用他所熟悉的东西去给你寻找合适的手机(执行函数),最后你得到了一款或者多款手机(返回值)。在此过程中,你可以对手机等知识一无所知,但却能买到一款手机(当然也可能会被坑)。

通过以上的购买手机的场景,我们可以归纳出函数的生命周期,即:

定义函数给填入正确的参数调用函数执行函数得到返回值基础部分无参数函数函数定义的方法

def say_hello():    print("Hello!")
函数的调用方法
say_hello()
函数的执行结果

Hello!

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,再接着是一个冒号,最后进行缩进之后,写函数执行的步骤。调用函数 先是函数名称,紧接着是一个圆括号,运行代码之后即可成功调用有多个参数的函数函数的定义方法

def add(a,b):    c = a+b    print('{} + {} = {}'.format(a,b,c))
函数的调用方法
add(1,2)
函数的执行结果

1 + 2 = 3

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填多个以逗号为分隔符的变量(参数),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤。调用函数 先是函数名称,紧接着是一个圆括号,接着在圆括号里面以逗号为分隔符填写与函数定义个数相符合的参数,运行代码之后即可成功调用。有单个返回值的函数函数定义方法

def add(a,b):    c = a+b    return c
函数调用方法
c = add(1,2) # 将返回值存储到变量 c 里面print(c) # 输出返回值
函数执行结果

3

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填多个以逗号为分隔符的变量(参数),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤,并且在步骤写完之后,使用关键字 return 加 一个要返回的数据,以此来返回一个任意类型的数据。调用函数 先是函数名称,紧接着是一个圆括号,接着在圆括号里面以逗号为分隔符填写与函数定义相符合的参数,运行代码之后即可成功调用,如果需要接受返回值,则需要在 = 前面填 1 个符合变量规范的变量。有多个返回值的函数函数定义方法

def double(a,b):    a = 2*a    b = 2*b    return a,b
函数调用方法
a,b = double(1,2) # 调用 double 函数并将返回值对应存储到 a,b 两个变量中print(a,b)# 输出返回值
函数执行结果

2 4

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填多个以逗号为分隔符的变量(参数),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤,并且在步骤写完之后,使用关键字 return 加 多个要返回的数据(以逗号为分隔符),以此来返回多个任意类型的数据。调用函数 先是函数名称,紧接着是一个圆括号,接着在圆括号里面以逗号为分隔符填写与函数定义相符合的参数,运行代码之后即可成功调用,如果需要接受返回值,则需要在 = 前面填与返回的数据个数一致的变量(以逗号为分隔符)不定参数函数函数定义方法

def say(*values):    print(values)
函数调用方法
say() # 无参数say(1) # 1 个参数say(1,2) # 2 个参数
函数执行结果

() (1,) (1, 2)

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填一个以 * 开头的参数名称,例如 *values),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤。调用函数 先是函数名称,紧接着是一个圆括号,接着可以在圆括号填任意多个参数(多个则以逗号为分隔符),运行代码即可调用。输出结果解释 不定参数的函数调用之后,以上面的代码为例,可以看到,多个参数被以元组的形式存储到 value 这个变量里面有可选参数的函数函数定义方法

def say(name = "Mike"):    print("Hello",name)
函数调用方法
say() # 使用默认参数say(name="John") # 使用自己提供的参数
函数执行结果
Hello MikeHello John
详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填一个或者多个以逗号为分隔符的变量(key = value 的形式,其中 value 是默认值),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤,再运行代码即可。调用函数 先是函数名称,紧接着是一个圆括号,接着在圆括号里面以逗号为分隔符填写与函数定义相符合的参数,运行代码之后即可成功调用。输出结果解释 以 key = value 的形式设定参数之后,会优先使用我们提供的参数,否则优先使用函数定义时的默认可选参数。有任意多个可选参数的函数函数定义方法
def say(**kwargs):    print(kwargs)
函数调用方法
say() # 不提供参数say(name = "Mike",age = 18) # 提供两个参数
函数执行结果

{} {'name': 'Mike', 'age': 18}

详解定义函数 以 关键字 def 为开头,紧接着一个空格之后,到函数的名称(需符合命名规范),然后到一个圆括号,圆括号里面填一个以 开头的参数名称,例如 kwargs),再接着是一个冒号,最后进行缩进之后,写函数执行的步骤。调用函数 先是函数名称,紧接着是一个圆括号,接着在圆括号里面以逗号为分隔符填写与函数定义相符合的参数,运行代码之后即可成功调用。输出结果解释 以 key1 = value1,key2 = value2 这形式在圆括号里面填参数之后,它们会被以字典的形式存储在 kwargs 这个 dict 类型的变量里面进阶部分

现在编程界有很多代码编辑器具有代码补全功能,例如 Visual Studio Code 跟 Pycharm。就 Python 而言,如果我们在定义函数的时候,使用了上面的基础部分提供的示例,那编辑器是无法推断出函数的参数以及返回值是什么类型的,这样子在写代码的时候就不能很好地发挥编辑器强大的代码补全提示功能,例如我想实现字符串批量替换功能,那么按照基础部分,我们可能会这么定义函数

def replace(src,old,new):    out = src.replace(old,new)    return out

然后这么调用

src = "I love C++"old = "C++"new = "Python"out = replace(src,old,new)print(out)

得到这样子的输出结果

I love Python

如果我们给函数加上类型注解,那么它的定义会是这样子

def replace(src: str, old: str, new: str) -> str:    out = src.replace(old, new)    return out

调用的代码以及输出的结果跟上面的那一版是一致的 那么二者的区别在哪里呢?

结构上看,第二种方法原来的基础上,在函数的参数后面加了 : str 这种东西,然后再函数的括号后面加了 ->str 这种东西。 功能上看,第二种方法可以让编辑器认为 src、old、new 这3 个参数是 str 类型的变量,以及 replace 函数的返回结果是 str 类型。基于此,编辑器可以在你使用参数,比如 src 这个 str 类型的参数的时候,为你提供属于 str 类型的变量的代码补全提示 可维护角度上看,第二种方法更容易让你发现 bug 并且减少出错的概率(毕竟编辑器可以帮你推断变量类型并且为你提供补全功能)

下面以 Visual Studio Code 为例,给大家演示一下两种方法的区别 首先来个基础版的动图

接着是进阶版的动图

如果你注意看第一张跟第二张图,我敲 src 再输入 . 的瞬间,会发现编辑器的表现不一样。具体是第一张图里面编辑器没有给我任何提示,而第二张图则默认 src 为 str 类型,于是编辑器为我提供了 str 类型变量拥有的方法提示,极大地减少了出错概率。 以上是对类型注解这个功能的一些基本介绍,更加详细的使用方法建议自行查阅相关资料。

写在最后

本文尽可能地以例子的形式为大家展示了怎么定义以及调用Python里面的函数,希望能给大家的学习带来帮助。最后,我一直认为个人的思考难免有疏漏之处,所以欢迎各路英雄前来赐教!(未经同意,勿转载哦)

标签: #python的src