Python 函数

python函数有四类,分别是:内置函数(builtin functions),标准库函数,第三方库函数,自定义函数。

内置函数:python一经运行就加载到内存的,例如有list,len,str等函数

标准库函数:需要用import语句进行导入,常见标准库有time,os等

第三方库:需要另外下载到本地的库,例如opencv库,然后用import导入

自定义函数:自己在模块里的写的函数

Python 中使用def语句创建函数,其一般的格式如下所示:

在内存里创建一块内存块来存储代码信息,即函数对象,然后将内存块的首地址给函数名称,实现变量名与函数对象的绑定。

函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的

代码,则所有调用该函数的地方都能得到体现。

使用方式:先定义函数,后调用函数

函数语法结构:

def 函数名(参数1,参数2,参数3,…): #参数相当于变量,参数可以为1个或者多个,用逗号隔开,还可以没有参数,等于无参;代码块是函数的实现,又叫函数体
‘’‘注释’‘’
函数体
return 返回的值

函数调用:

函数名() ,除了用函数名来绑定函数对象之外,也可以用其他变量名来绑定函数。
函数名要能反映其意义

#定义函数
def demo():#无参数函数
    #书写函数体
    print('dingyihaole')
    #返回结果
#调用函数,执行结果
#demo()
fun_copy=demo  #fun_copy也与函数对象进行了绑定
fun_copy()

函数定义中的参数,称之为形式参数

函数调用中的参数,称之为实际参数

def demo(name):#有参数函数
    #书写函数体
    print(name)
    #返回结果
#调用函数,执行结果
demo('din')

以上需要注意的是:

1、函数在有返回值的情况下会根据实际情况进行返回,如果函数没有返回值则返回None

2、函数即“变量”,“变量”必须先定义后引用。未定义而直接引用函数,就相当于在引用一个不存在的变量名

3、我们在使用函数时,一定要明确地区分定义阶段和调用阶段

4、实参的位置和形参一一对应,不能多也不能少。

5、用形参的名字作为关键字来指定具体传递的值,则在函数调用时,前后顺序将不受影响。

# def foo():
#     print('from foo')
#     bar() #未定义直接用
# foo() #报错

#测试二  都已经定义并引用
def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
foo() #正常 

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式 所谓“返回值”,就是程序中函数完成事情后,最后给调用者的结果

当return被执行,代表函数调用结束,也就是说return语句的作用之二就是结束函数的调用。

def printme(str):
    "打印任何传入的字符串"
    print(str)
    return  str #通过返回值,将相加的结果返回给调用者    函数在执行完成后,返回给调用者的结果   函数体在遇到return后就结束了,所以写在return后的代码不会执行
printme('sui')

def sums(a,b):
    res=a+b;
    return res  #返回结果
r=sums(3,4)
print(r)

如果函数体里不写return,默认返回None。

def pr():
    print(666)
print(pr())  # 先调用pr,再打印出返回值
def pr():
    print(666)
    return range(5)
print(pr())  # 先调用pr,再打印出返回值

变量的作用域:全局变量 局部变量

变量起作用的范围称为变量的作用域,不同作用域内同名变量之间互不影响

所谓起作用的范围就是,某些代码他隶属于不同的语句。例如定义了一个函数,函数体里的所有代码是属于这个函数的,因为缩进已经不同了。在函数体里的定义的变量在函数里面可以使用,但是在函数外边却用不了。

作用域为定义的模块,从定义位置开始直到模块结束。也就是说,全局变量即使没有定义在函数里边,但是在函数里边也可以使用,只是使用而已,修改的话需要作说明

全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。

要在函数内修改全局变量的值,使用 global 声明一下。如果不调用函数,是不能直接调用函数内部的全局变量的

设置全局 既能够在函数内部调用,也能在外部其他地方调用

age=100
print(age, 'and id is ', id(age))
def test():
    print(age, 'and id is ', id(age))  #通过ID看出来同一个变量
test()
def test2():
    global age
    print(age, 'and id is ', id(age))
test2()
def test4():
    age=100
    print(age, 'and id is ', id(age))
test4()

1 ,在函数体中声明的变量。(包括形参变量也是局部变量)。

2 ,局部变量的引用比全局变量快,优先考虑使用。这里是说,在函数或者类里面操作自己的局部变量比操作外部变量快。

3 ,如果局部变量和全局变量同名,如果对同名变量进行赋值操作,则在函数内隐藏全局变量,只使用同名的局部变量(当局部变量和全局变量的变量名字一样时,局部变量的作用域以为局部变量值为准,此时改变局部变量的值不会影响全局变量的值)

(1)局部变量,是在函数内部定义的变量

(2)局部变量使用的范围是本函数内部,其他函数以及外部访问一律无效

(3)当函数被调用是,局部变量被创建,函数调用结束时,局部变量又被释放

#设置局部 内部调用
age=900
def test1():
    age=101
    print(age, 'and id is ', id(age))
test1()

def number():
    #定义局部变量a, b
    a = 1
    b = 2
    print(a, b)
#调用时局部变量生效
number()
#不调用时,进行外部访问无效
# print(a, b)


#混合用法
key="设置全局变量key"
print("1、直接全局变量****"+key+"\n")
def first():
    key="局部变量key"
    print("2、进入first函数****"+key+"\n")
def second():
    print("3、进入second函数****"+key+"\n")
def third():
    global key
    key="全局通用(即全局变量)global key"
    print("4、进入third函数,在third函数内部,赋给key新值,且为global,引用third()后的key为"+key+"\n")
 
 

first()

second()
 
third()#由于我们给third()内部定义了一个global key,探测一下等下再调用third()的时候,我们的全局key会不会改变为third()中的key值。即 第一种 的结论。(当然哈,肯定是会的,证明见下一步)
 
print("引用third()函数后的"+key+"\n")#探测一下global key会不会影响 全局内的key(答案是会影响,因为我们第一种说过。在局部变量里面global key相当于在全局作用域里直接写一个key一样的效果。)
second()

如果不调设置的全局global 函数,后续是不会改变key全局变量值的呢

你可能感兴趣的:(#,基础,python,开发语言,自动化,可用性测试)