草庐IT

python语法教程——def()函数

Anfies 2023-04-20 原文

什么是函数?

我们在编程的过程中往往会发现,实现某一功能的代码块会被频繁地使用。如果每次使用这段代码都得复制粘贴,这会使得代码冗长而又臃肿,增大了代码的阅读难度。为了方便我们实现对代码块的复用,人们提出了函数功能。

如何定义函数?

函数的定义以关键字def开头,后面接函数名称和圆括号。
括号中放入函数需要的参数。
通过冒号和缩进控制函数内容。
函数的结构如下所示:

def 函数名(参数):
    函数体

定义第一个函数

在学习一门语言时,我们最先学会的是如何输出Hello world。那么,我们的第一个函数也就从最简单的输出Hello world开始。

def hello():
    print('Hello world!')
    
hello()

输出:

Hello world!

可以看到,我们调用了我们定义的hello函数,函数执行了其中的print语句。

什么是形参实参,什么是返回值?

这里我们定义一个可以计算两个数之和的函数add1,可以先运行一下看看。

def add1(num1, num2):
    result = num1 + num2

    return result

x1, x2 = 1, 2
y = add1(x1, x2)
print(y)

输出:

3

函数完美地计算出了1加2的值。

同刚才的Hello world函数相比,我在add函数中加入了num1、num2和return。其运作原理如下:
在调用add函数时,我们将x1,x2传入add中,由num1和num2分别接收了来自x1和x2的值,将num1和num2的数值相加后传给result,最后函数输出result的值给y,我们打印出y的值,就是3。

那么这里面的num1、num2就是形参,x1、x2就是实参,return result就是函数的返回语句,其返回的就是result的值,所以result就是返回值。

由此可见,形参就是我们在函数定义过程中定义在括号内的参数。实参就是我们输入函数的参数,返回值就是return后面的语句的计算值。

我比较喜欢通过数学中对函数的定义来理解编程语言中的函数。在数学中函数的定义式是y = f(x)那么这里x就是我们传入的参数,f就是函数体,用来对x进行计算,计算结果y就是函数的返回值。

函数参数的一些额外用法

还是刚才的add1函数,但是我们参数的赋值方式不一样了:

def add1(num1, num2):
    result = num1 + num2

    return result
    
y = add1(num1=1, num2=2)
print(y)

输出:

3

我们也可以对函数的形参赋予初始值

def add2(num1=1, num2=1):
    result = num1 + num2

    return result

y = add2()
print(y)

输出:

2

在形参赋初值的情况下,我们又可以如下进行传参。

def add2(num1=1, num2=2):
    result = num1 + num2

    return result

y = add2(3)
print(y)

输出:

5

可见3按顺序替换了add2函数的第一个形参,导致num1变为3,result变为5。

那如果我们想不按顺序更改其中的参数呢?

def add2(num1=1, num2=2):
    result = num1 + num2

    return result

y = add2(num2=3)
print(y)

输出:

4

可以看到,3并没有按顺序替换add2函数的第一个参数,而是传给了num2,这样result的值就是4了。

任意传递实参

当我们传入函数中的参数不固定怎么办呢?

def save(*temp):
    return temp


y = save('1', 2, 'abc', True)
print(y)

输出:

('1', 2, 'abc', True)

可以看到,如果形参加上一个星号,它就相当于一个元组,我们传入的参数将以元组的形式保存。

def student(**temp):
    return temp


y = student(name='老王', age=20, high=180, is_student=True)
print(y)

输出:

{'name': '老王', 'age': 20, 'high': 180, 'is_student': True}

当形参前带有两个星号时,它就相当于一个字典了。

附加

函数也可以写在其他文件里用来调用。这里我们还是用一开始的add1函数。

from aboutadd import add1


y = add1(1, 2)
print(y)

输出:

3

通过图片可以看到文件间的关系。


有关python语法教程——def()函数的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  6. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  7. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  8. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  9. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  10. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

随机推荐