python之路——初识函数

初识函数定义与调用

1 def mylen(s):
2     length = 0
3     for i in s:
4         length = length+1
5     print(length)
6     return length
View Code

总结一:

定义:def 关键词开头,空格之后接函数名称和圆括号(),圆括号()内's'为参数,最后还有一个":"。

   def 是固定的,不能变,必须是连续的def三个字母,不能分开。。。它们要相亲相爱的在一起。

   空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。

   函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能

   括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!

注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。

调用:就是 函数名() 要记得加上括号,好么好么好么。

 

return关键字的作用

  return 是一个关键字,在pycharm里,你会看到它变成蓝色了。你必须一字不差的把这个单词给背下来。

  这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”

要研究返回值,我们还要知道返回值有几种情况:分别是没有返回值、返回一个值、返回多个值

没有返回值

  不写return的情况下,会默认返回一个None:我们写的第一个函数,就没有写return,这就是没有返回值的一种情况。

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函数调用
str_len = mylen()
#因为没有返回值,此时的str_len为None
print('str_len : %s'%str_len)
不写return

只写return,后面不写其他内容,也会返回None,def定义函数中一旦遇到return,结束整个函数

def ret_demo():
    print(111)
    return
    print(222)

ret = ret_demo()
print(ret)
只写return

return None:和上面的两种情况一样,我们一般不这样写。

def ret_demo():
    print(111)
    return None
    print(222)

ret = ret_demo()
print(ret)
return None

返回一个值

      刚刚我们已经写过一个返回一个值的情况,只需在return后面写上要返回的内容即可。

def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    return length

#函数调用
str_len = mylen()
print('str_len : %s'%str_len)
返回一个值

      注意:return和返回值之间要有空格,可以返回任意数据类型的值

返回多个值

      可以返回任意多个、任意数据类型的值

def ret_demo1():
    '''返回多个值''' 
    return 1,2,3,4


def ret_demo2():
    '''返回多个任意类型的值'''
    return 1,['a','b'],3,4

ret1 = ret_demo1()
print(ret1)
ret2 = ret_demo2()
print(ret2)
返回多个值

      返回的多个值会被组织成元组被返回,也可以用多个值来接收

def ret_demo2():
    return 1,['a','b'],3,4

#返回多个值,用一个变量接收
ret2 = ret_demo2()
print(ret2)

#返回多个值,用多个变量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)

#用多个值接收返回值:返回几个值,就用几个变量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)
多个返回值的接收
#python中把用逗号分割的多个值就认为是一个元组。也适用于字符串、列表、字典、集合

函数的参数

我们告诉mylen函数要计算的字符串是谁,这个过程就叫做 传递参数,简称传参,我们调用函数时传递的这个“hello world”和定义函数时的s1就是参数

实参与形参

参数还有分别:

我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。

定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。  

传递多个参数

参数可以传递多个,多个参数之间用逗号分割。

-------------------

函数进阶

  • 命名空间和作用域
      • 内置命名空间----python解释器
        • 就是pyrhon解释器一启动就可以使用的名字存储在内置命名空间中
        • 内置的名字在启动解释器的时候就被加载在内存里
      • 全局命名空间----我们写的代码但不是函数中的代码
        • 时在程序从上到下被执行的过程中依次添加进内存的
        • 放置了我们设置的所有变量名和函数名
      • 局部命名空间----函数
        • 就是函数内部定义的名字
        • 当调用函数时,才会产生这个命名空间,随着函数执行的结束,这个命名空间就又消失了

注:在局部,可以使用全局、内置命名空间中的名字

  在全局,可以使用内置命名空间中的名字,但是不能使用局部命名空间中的名字

  在内置,既不嫩局部也不能使用全局的

在正常情况下,直接使用内置的名字

当我们在全局定义了和内置名字空间中的名字时,会使用全局的名字

当全局没有的时候会找上一级内置去调,当全局有的时候就使用自己的

如果上一级也没有就再往上一级去调用,直到内置的名字空间都没有就报错

多个函数应该拥有多个独立的局部命名空间,

 

作用域

全局作用域  -- 作用在全局 -- 内置和全局名字空间中的名字都属于全局作用域 --globals

局部作用域      -- 作用在局部 -- 函数(局部名字空间中的名字属于局部作用域)--locals

对于不可变数据类型 在局部可以查看全局作用域中的变量

但是不能直接修改

如果想要修改,需要在程序一开始添加global声明

如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

globals 永远打印全局的名字

locals 在局部就打印局部的,在全局的就使用全局的 根据所在位置输出

 

posted @ 2017-12-27 14:24  摇曳时光  阅读(229)  评论(0编辑  收藏  举报