; 函数的一些简单笔记 | Linux运维部落

函数的一些简单笔记

函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
数学定义:y=f(x),y是x的函数,x是自变量

Python函数:
    <span class="hljs-number">1</span>、有若干个语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元
    <span class="hljs-number">2</span>、完成一定的功能
   
函数的作用:
    <span class="hljs-number">1</span>、结构化编程对代码的基本的封装,一般按照功能组织一段代码
    <span class="hljs-number">2</span>、封装的目的为了复用,减少冗余代码
    <span class="hljs-number">3</span>、代码更加简洁美观、可读易懂

函数的分类:
    <span class="hljs-number">1</span>、内建函数,如max()、reversed()等
    <span class="hljs-number">2</span>、库函数,如math.ceil()等

函数定义、调用


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<span class="hljs-function"><span class="hljs-keyword">def</span>语句定义函数:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> 函数名<span class="hljs-params">(参数列表)</span></span>:
        函数体(代码块)
        [<span class="hljs-keyword">return</span> 返回值]
       
    <span class="hljs-number">1</span>、函数名就是标识符,命名要求一样
    <span class="hljs-number">2</span>、语句块必须缩进,约定<span class="hljs-number">4</span>个空格
    <span class="hljs-number">3</span>、Python的函数没有<span class="hljs-keyword">return</span>语句,隐式会返回一个None值
    <span class="hljs-number">4</span>、定义中的参数列表成为形式函数,只是一种符号表达,简称形参

调用:
    <span class="hljs-number">1</span>、函数定义,只是声明了一个函数,它不会被执行,需要调用
    <span class="hljs-number">2</span>、调用的方式,就是函数名加上小括号,括号内写上参数
    <span class="hljs-number">3</span>、调用时写的参数是实际参数,是实实在在传入的值,简称实参

函数举例
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">(x,y)</span></span>:
        result = x+y
        <span class="hljs-keyword">return</span> result
    out = add(<span class="hljs-number">4</span>,<span class="hljs-number">5</span>)
    print(out)
   
    <span class="hljs-number">1</span>、上面只是一个函数的定义,有一个函数叫做add,接收<span class="hljs-number">2</span>个参数
    <span class="hljs-number">2</span>、计算的结果,通过返回值返回
    <span class="hljs-number">3</span>、调用通过函数名add加<span class="hljs-number">2</span>个参数,返回值可使用变量接收
    <span class="hljs-number">4</span>、定义需要在调用前,也就是说调用时,已经被定义过了,否则抛NameError异常
    <span class="hljs-number">5</span>、函数是可调用对象,callable()

函数参数:
    参数调用时传入的参数要和定义的个数相匹配(可变参数例外)
   
    位置参数:
        <span class="hljs-number">1</span>、<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">f</span><span class="hljs-params">(x,y,z)</span></span>调用使用f(<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>)
        <span class="hljs-number">2</span>、按照参数定义顺序传入实参
       
    关键字参数:
        <span class="hljs-number">1</span>、<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">f</span><span class="hljs-params">(x,y,z)</span></span>调用使用f(x=<span class="hljs-number">1</span>,y=<span class="hljs-number">3</span>,z=<span class="hljs-number">5</span>)
        <span class="hljs-number">2</span>、使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同
       
        f(z=None,y=<span class="hljs-number">10</span>,x=[<span class="hljs-number">1</span>])
        f((<span class="hljs-number">1</span>),z=<span class="hljs-number">6</span>,y=<span class="hljs-number">4.1</span>)
        备注:要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的
   
    参数默认值:
        <span class="hljs-number">1</span>、定义时,在形参后跟上一个值
        <span class="hljs-number">2</span>、<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">(x=<span class="hljs-number">4</span>,y=<span class="hljs-number">5</span>)</span></span>:
               <span class="hljs-keyword">return</span> x+y
        add(<span class="hljs-number">6</span>,<span class="hljs-number">10</span>),add(<span class="hljs-number">5</span>,y=<span class="hljs-number">9</span>),add(x=<span class="hljs-number">3</span>),add(),add(y=<span class="hljs-number">8</span>),add(x=<span class="hljs-number">1</span>,y=<span class="hljs-number">2</span>),add(y=<span class="hljs-number">2</span>,x=<span class="hljs-number">100</span>)
       
        举例:
            定义一个函数login,参数名称为host、port、username、password
            <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">login</span><span class="hljs-params">(host=<span class="hljs-string">'127.0.0.1'</span>,port=<span class="hljs-string">'80'</span>,username=<span class="hljs-string">'eric'</span>,password=<span class="hljs-string">'123456'</span>)</span></span>:
                print(<span class="hljs-string">'{}:{}@{}/{}'</span>.format(host,port,username,password))
            login()
            login(<span class="hljs-string">'127.0.0.1'</span>,<span class="hljs-number">80</span>,<span class="hljs-string">'eric'</span>,<span class="hljs-string">'123456'</span>)
           
            login(<span class="hljs-string">'localhost'</span>,username=<span class="hljs-string">'root'</span>)
           
            login(<span class="hljs-string">'localhost'</span>,port=<span class="hljs-number">3306</span>,password=<span class="hljs-string">'123456'</span>)
           
            login(port=<span class="hljs-number">80</span>,password=<span class="hljs-string">'123456'</span>,host=<span class="hljs-string">'172.16.15.100'</span>)
           
    可变参数:
        累加求和的问题
        <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">(nums)</span></span>:
            sum = <span class="hljs-number">0</span>
            <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-symbol">nums:</span>
                sum += x
            <span class="hljs-keyword">return</span> sum
        add([<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>])
        add((<span class="hljs-number">2</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>))
        传入一个可迭代对象,迭代元素求和
       
        一个形参可以匹配任意个参数
       
    位置参数的可变参数:
        有多个数,需要累加求和
        <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">(*nums)</span></span>:
            sum = <span class="hljs-number">0</span>
            print(type(nums))
            <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> <span class="hljs-symbol">nums:</span>
                sum += x
            print(sum)
        In [<span class="hljs-number">68</span>]: add(<span class="hljs-number">3</span>,<span class="hljs-number">6</span>,<span class="hljs-number">9</span>)
        &lt;<span class="hljs-class"><span class="hljs-keyword">class</span> '<span class="hljs-title">tuple</span>'&gt;</span>
        <span class="hljs-number">18</span>
    在形参前使用*表示该形参是可变参数,可以接收多个实参

函数的返回值


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
举例:
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">(x)</span>:</span>
    print(x)
    <span class="hljs-keyword">return</span> x+<span class="hljs-number">1</span>
showplus(<span class="hljs-number">5</span>)
执行结果为:<span class="hljs-number">5</span>

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">(x)</span>:</span>
    <span class="hljs-keyword">if</span> x &gt; <span class="hljs-number">3</span>:
            <span class="hljs-keyword">return</span> <span class="hljs-string">"&gt;3"</span>
    <span class="hljs-keyword">else</span>:
            <span class="hljs-keyword">return</span> <span class="hljs-string">"&lt;=3"</span>
print(showplus(<span class="hljs-number">5</span>))
返回:&gt;<span class="hljs-number">3</span>


例子:
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">(x)</span>:</span>
    <span class="hljs-keyword">if</span> x &gt; <span class="hljs-number">3</span>:
            <span class="hljs-keyword">return</span> x
    <span class="hljs-keyword">else</span>:
            print(<span class="hljs-string">"{} is not greater than 3"</span>.format(x))
print(showplus(<span class="hljs-number">2</span>))
返回:
<span class="hljs-number">2</span> <span class="hljs-keyword">is</span> <span class="hljs-keyword">not</span> greater than <span class="hljs-number">3</span>
<span class="hljs-keyword">None</span>


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">(x)</span>:</span>
    <span class="hljs-keyword">if</span> x &gt; <span class="hljs-number">3</span>:
            <span class="hljs-keyword">return</span> x
    <span class="hljs-keyword">else</span>:
            print(<span class="hljs-string">"{} is not greater than 3"</span>.format(x))
print(showplus(<span class="hljs-number">5</span>))
返回值为:<span class="hljs-number">5</span>

总结:
    <span class="hljs-number">1</span>、Python函数使用<span class="hljs-keyword">return</span>语句返回“返回值”
    <span class="hljs-number">2</span>、所有函数都有返回值,如果没有<span class="hljs-keyword">return</span>语句,隐式调用<span class="hljs-keyword">return</span> <span class="hljs-keyword">None</span>
    <span class="hljs-number">3</span>、<span class="hljs-keyword">return</span>语句并不一定是函数的语句块的最后一条语句
    <span class="hljs-number">4</span>、一个函数可以存在多个<span class="hljs-keyword">return</span>语句,但是只有一条可以被执行。如果没有一条<span class="hljs-keyword">return</span>语句被执行到,隐式调用<span class="hljs-keyword">return</span> <span class="hljs-keyword">None</span>
    <span class="hljs-number">5</span>、如果有必要,可以显示调用<span class="hljs-keyword">return</span> <span class="hljs-keyword">None</span>,可以简写为<span class="hljs-keyword">return</span>
    <span class="hljs-number">6</span>、如果函数执行了<span class="hljs-keyword">return</span>语句,函数就会返回,当前被执行的<span class="hljs-keyword">return</span>语句之后的其它语句就不会被执行了
    <span class="hljs-number">7</span>、作用:结束函数调用、返回值

返回多个值:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">return</span> [<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>]
showplus()
print(showplus())
打印出:[<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>]

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>
showplus()
print(showplus())
打印出:(<span class="hljs-number">1</span>, <span class="hljs-number">3</span>, <span class="hljs-number">5</span>)

<span class="hljs-number">1</span>、函数不能同时返回多个值
<span class="hljs-number">2</span>、<span class="hljs-keyword">return</span>[<span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>]是指明返回一个列表,是一个列表对象
<span class="hljs-number">3</span>、<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>看似返回多个值,隐式的被Python封装成了一个元组

使用解构提取出来,将更加方便和明白
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">showplus</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>,<span class="hljs-number">3</span>,<span class="hljs-number">5</span>
x,y,z = showplus()
print(x,y,z)
打印结果为:<span class="hljs-number">1</span> <span class="hljs-number">3</span> <span class="hljs-number">5</span>

函数嵌套


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在一个函数中定义了另外一个函数
def fn():
    def <span class="hljs-builtin-name">add</span>():
            <span class="hljs-builtin-name">print</span>(<span class="hljs-string">"add"</span>)
    <span class="hljs-builtin-name">print</span>(<span class="hljs-string">"fn"</span>)
    <span class="hljs-builtin-name">add</span>()
fn()
打印结果为:
    fn
    <span class="hljs-builtin-name">add</span>

def fn():
    def <span class="hljs-builtin-name">add</span>():
            <span class="hljs-builtin-name">print</span>(<span class="hljs-string">"add"</span>)
    <span class="hljs-builtin-name">print</span>(<span class="hljs-string">"fn"</span>)
    <span class="hljs-builtin-name">add</span>()
fn()
<span class="hljs-builtin-name">add</span>()#这个是会报错的,因为函数有可见范围,也就是作用域,内部的函数不能被外部直接使用,会抛出NameError异常

作用域


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<span class="hljs-number">1</span>、一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域

<span class="hljs-keyword">x</span> = <span class="hljs-number">6</span>
def fn():
    print(<span class="hljs-keyword">x</span>)
fn()
返回值打印结果为:<span class="hljs-number">6</span>

<span class="hljs-keyword">x</span> = <span class="hljs-number">6</span>
def fn():
    #<span class="hljs-keyword">x</span> = <span class="hljs-number">3</span>
    <span class="hljs-keyword">x</span> += <span class="hljs-number">1</span>
    print(<span class="hljs-keyword">x</span>)
fn()
注:如果把<span class="hljs-keyword">x</span>=<span class="hljs-number">3</span>注释掉,就会报语法错误
原因:<span class="hljs-keyword">x</span> += <span class="hljs-number">1</span>其实就是<span class="hljs-keyword">x</span> = <span class="hljs-keyword">x</span> + <span class="hljs-number">1</span>,相当于在fn内部定义一个局部变量<span class="hljs-keyword">x</span>,那么fn内部所有<span class="hljs-keyword">x</span>都是这个局部变量<span class="hljs-keyword">x</span>了,但是这个<span class="hljs-keyword">x</span>还没有完成赋值,就被拿来做加<span class="hljs-number">1</span>操作了

全局作用域:
    在整个程序运行环境中都可见

局部作用域:
    <span class="hljs-number">1</span>、在函数、类等内部可见
    <span class="hljs-number">2</span>、局部变量使用范围不能超过其所在的局部作用域

嵌套解构


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fn</span><span class="hljs-params">()</span>:</span>
    o =<span class="hljs-number">65</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">()</span>:</span>
            print(<span class="hljs-string">"add{}"</span>.format(o))
            print(chr(o))
    print(<span class="hljs-string">"fn{}"</span>.format(o))
    add()
fn
打印结果:
    fn65
    add65
    A

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fn</span><span class="hljs-params">()</span>:</span>
    o =<span class="hljs-number">65</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">add</span><span class="hljs-params">()</span>:</span>
            o = <span class="hljs-number">97</span>
            print(<span class="hljs-string">"add{}"</span>.format(o))
            print(chr(o))
    print(<span class="hljs-string">"fn{}"</span>.format(o))
    add()
fn()
打印结果为:
    fn65
    add97
    a
从以上嵌套的例子可以看出:
    <span class="hljs-number">1</span>、外层变量作用域在内层作用域可见
    <span class="hljs-number">2</span>、内层作用域中add,如果定义了o=<span class="hljs-number">97</span>,相当于当前作用域中重新定义了一个新变量o,但是这个o并没有覆盖外层作用域fn中的o
   
   
例子:
    x = <span class="hljs-number">6</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fn</span><span class="hljs-params">()</span>:</span>
        <span class="hljs-comment">#x = 4</span>
        y = x + <span class="hljs-number">1</span>
        <span class="hljs-comment">#x += 1</span>
        print(x)
    fn()
    注:如果把x += <span class="hljs-number">1</span>前面的<span class="hljs-comment">#号取消掉,同样还是报错,是因为x还没有完成赋值,就被拿来做加1操作了</span>
   
全局变量<span class="hljs-keyword">global</span>:
    x = <span class="hljs-number">6</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fn</span><span class="hljs-params">()</span>:</span>
        <span class="hljs-keyword">global</span> x
        x += <span class="hljs-number">1</span>
    fn()
    print(x)
    返回值:<span class="hljs-number">7</span>
   
原因:使用<span class="hljs-keyword">global</span>关键字的变量,将fn内的x声明为使用外部的全局作用域中定义的x;全局作用域中必须有x的定义

<span class="hljs-comment">#x = 6</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">fn</span><span class="hljs-params">()</span>:</span>
    <span class="hljs-keyword">global</span> x
    x = <span class="hljs-number">10</span>
    x += <span class="hljs-number">1</span>
    print(x)
fn()
print(x)
返回结果为:
    <span class="hljs-number">11</span>
    <span class="hljs-number">11</span>
原因:使用<span class="hljs-keyword">global</span>关键字的变量,将fn内的声明为使用外部的全局作用域中定义的x;但是,x=<span class="hljs-number">10</span>赋值即定义,x在内部作用域为一个外部作用域的变量赋值,所以x+=<span class="hljs-number">1</span>不会报错,但是需要注意的是,这里的x作用域还是全局的。

global总结


1
2
3
4
5
6
7
8
<span class="hljs-keyword">x</span> += <span class="hljs-number">1</span>这种是特殊形式产生的错误,先引用,后赋值,而python动态语言是赋值才算定义,才能被引用。在语句之前加上<span class="hljs-keyword">x</span>=<span class="hljs-number">0</span>之类赋值语句,或者使用<span class="hljs-keyword">global</span>告诉内部作用域,去全局作用域查找变量定义。

内部作用域使用<span class="hljs-keyword">x</span>=<span class="hljs-number">5</span>之类的赋值语句会重新定义局部作用域使用的变量<span class="hljs-keyword">x</span>,但是,一旦这个作用域中使用<span class="hljs-keyword">global</span>声明<span class="hljs-keyword">x</span>为全局的,那么<span class="hljs-keyword">x</span>=<span class="hljs-number">5</span>相当于在为全局作用域的变量<span class="hljs-keyword">x</span>赋值。

<span class="hljs-keyword">global</span>使用原则:
    <span class="hljs-number">1</span>、外部作用域变量在内部最用于可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的就是为了封装,尽量与外界隔离。
    <span class="hljs-number">2</span>、如果函数需要使用外部全局变量,请使用函数的形参传参解决
    <span class="hljs-number">3</span>、一句话:不用<span class="hljs-keyword">global</span>。学习知识为了深刻理解变量作用域

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:/87818

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐开户  测试  万达娱乐主管QQ  万达注册  万达主管QQ  万达娱乐主管  万达主管QQ  万达招商QQ  华宇招商  万达娱乐