文章目录

  • 什么是函数
  • 变量
  • 函数
  • 命名规范
  • 函数结构
  • 函数文档
  • 杂项
  • 参数、变量
  • 全局变量、局部变量
  • return


什么是函数

在数学上,函数的定义为从定义域到值域的映射。例如python 任何映射对象 python的映射函数_python,将2映射到4,3映射到9,4映射到16,等等。在python中也有很多函数,如python中自带的内置函数,以及通过import从其它库中引用的一些函数。除此之外你还可以自己编写一个用户自定义函数。
那么函数有什么用呢?我们在程序设计中把世间万物都当作一个个类来看待,如果说通过类把事物在计算机中抽象出来了,那么函数则让这类事物动起来活起来了。只要是有相同共性的一系‘列行为动作’我们就可以将其划分到一个函数中去,这样做的目的就是尽量让这类事物的活动更加的简便。而且也可以代码重用,避免了重复劳动,提高工作效率。
举个例子,当我们抽象出一辆车的时候,我们可以为其编写一个启动函数,那么在调用时只需 xx车.启动() 即可,具体如何启动,这些都是函数要做的事情了。
当然如果想更深刻的理解它,还需要不断地去积累,写的多了,码的多了,自然就无师自通了,所以学无止境。



变量

变量在本质上就是一个占位符在python中我们命名变量时,变量名尽量小写, 如有多个单词,用下划线隔开:

count = 0
student_name = ''



函数

命名规范

函数名一律小写,如有多个单词,用下划线隔开:

def sum():
    a+=b

def add_function():
    pass

私有函数在函数前加一个下划线_

class Person():

    def _private_func():
        pass



函数结构

让我们先来看一下定义函数的格式:

def 函数名(参数1,参数2,...参数n):
	函数体(语句块)

说了这么多还不如直接来个例子实在,

  • 函数签名(signature) 意思就是告知计算机,这里要声明一个函数,这个函数叫harmonic,需要一个n变量。
  • 函数名称(function name) 函数的名字
  • 形式参数变量(parameter variable) 就是个占位位置,因为后面计算要用到一个变量,但这个变量是多少不知道,所以先找一个符号代替一下。当函数被调用时会传入一个参数给n,当函数结束时,n也随着函数的结束而销毁,所以n只是走个形式而已。
  • 局部变量(local variable) 在函数内部定义使用。随函数运行结束而销毁。
  • return 语句 用于将控制权返回到程序的调用点。
  • 返回值(return value) 返回函数的计算结果。可没有。

在使用的时候我们仅需要调用该函数,将返回值绑定到一个变量上,即可。

sum = harmonic(100)
print(sum)

# 输出结果
5.187377517639621



函数文档

程序在大多数情况下是给人看的,只是偶尔被机器执行一下。所以在编程中要养成一个好习惯——写注释。那么如何写注释呢?
规范的函数说明是写在函数签名后面。

def sum():
    '''我们可以将函数说明写在这里'''
    pass

是不是很神奇,在使用时我们能看到在函数定义中的函数说明,这对于大量开发过程中又便于了解之前函数的作用是十分必要的。

python 任何映射对象 python的映射函数_函数_02


杂项

参数、变量

对于大多数初学者来说,可能对于什么是参数、变量傻傻的分不清楚。为此博主做了一张图。希望能够让你多少懂一些,不过不懂也没关系,就像开篇说函数一样,有些东西积累到一定程度了自然而然就懂了。

python 任何映射对象 python的映射函数_函数_03





全局变量、局部变量

全局变量和局部变量都是作用域的不同,更详细准确的介绍请参见类(基础)中的作用域。

  • 局部变量就是定义在一个函数体内部的变量
  • 全局变量是定义在外面的变量
    例如:
x=1
def function():
	y=2

其中x是全局变量,y是局部变量。我们只能在函数体内使用y在函数体外使用x。


那么如何在函数体内使用全局变量呢?
我们如果在函数体内直接对全局变量进行修改时,python的第一反应就是找这个变量,找得到就用找不到就创建,所以在函数体内的y=2时,python认为是对y这个局部变量赋值,因此创建了一个值为2的int对象并将其绑定到局部变量y上。因此我们可以使用global来显示的表明这是个全局变量。

  • global关键字
x,y=1,1
def func():
    global x
    x,y=2,2
func()
print(x,y)

# 运行结果
2,1

当然,我们如果在函数内部不去修改而是直接去用这个全局变量会怎么样呢? 这时候python的第一反应虽然还是找这个变量,但在函数内部没有找到,因此转向函数外面去寻找。所以是能够找到的。

x=5
def func():
    a=x+2
    print(a)
func()
# 输出结果
7




  • 列表修改
    之所以在函数内部修改全局变量会有误,是因为优先把改被修改变量当作局部变量,所以对于不可变数据类型,就直接像上面的y那样,python认为是对y这个局部变量赋值。对于可变数据类型,在修改时python则会报错。
x=[1,2]
def func():
    x+=[3]
    print(a)
func()
# 运行结果
UnboundLocalError: local variable 'x' referenced before assignment



有什么办法呢?当然有,可以通过可变对象的方法。以列表为例,我们在调用x.pop()时,先做的是使用x变量,但在函数内部没有找到,因此转向函数外面去寻找。当找到后再传入pop()中。(对于任何可变数据类型使用方法都是可行的) 原地址上修改也不会报错,原理类似,都是先用再改。

x=[1,2]
def func():
    x.pop()
    x.extend([3,4,5])
    x[0]=9
func()
print(x)

# 运行结果
[9,3,4,5]





return

值得一说的是return,当函数执行到return时,真个函数就已经结束了,之后的代码是不运行的。

def return_func ():
    '''return演示'''
    print("在return前面")
    return
    print("在return后面")

return_func()

# 运行结果
在return前面