python基础(函数、局部变量、全局变量、文件操作)

来源:互联网 发布:金数据怎么做 编辑:程序博客网 时间:2024/06/08 03:22

一、函数
1.函数的嵌套

函数的嵌套是指在函数的内部调用其他函数。C、C++只允许在函数体内部嵌套,而python不仅支持函数体内的嵌套,还支持函数定义的嵌套。

例如:

def print_line(n):   # for i in n:    for i in range(0,n):#需要将n转化为迭代器才可循环,利用range(start,end)函数生成0-(end-1)的迭代器        print("i=",i)        print("---------------------------------")n = int(input("请输入要打印的条数:"))print_line(n)#参数n是整型数字,不能构成迭代器,因此如果直接在循环中使用会发生错误#使用函数嵌套,直接修改函数,在大程序中可能会引起其他函数调用错误def print_line_new():    print("*")    print("**")    print("***")def call_print(n):    i = 0    while(i<n):        print_line_new()        i += 1n_new = int(input("请重新输入要打印的次数:"))call_print(n_new)

练习(计算3个数字的平均数):

def sum_3_num(x,y,z):    sum = x+y+z    return sumdef avg(x,y,z,n):    sum = sum_3_num(x,y,z)    avg = sum/n    return avg#尽可能的调用函数,当系统有新的功能时,应该编写函数调用以定义好的函数,而不是修改原来的函数avg_num = avg(1,2,3,3)print("avg=",avg_num)

2.函数返回多个值

三种方式:
(1)将多个值通过一个列表的形式返回

(2)将多个值通过一个元组的形式返回

(3)将多个值通过一个字典的形式返回

3.函数参数

(1)缺省参数
默认参数指在形参中指定参数的默认值,在调用函数没有传入该参数值时,函数将会使用参数的默认值,必须放在形参的最后位置,否则会出现错误,也可以在函数调用时指定参数,则参数的前后顺序对调用无影响。

def print_info(name,age = 35):    print "Name:",name    print "Age:",ageprint_info(name = "miki")print_info(age = 9,name = "miki")

调用print_info()函数只传入name值,则age的值为默认值35,当调用print_info()函数传入name值和age值时,age值为传入值。

4.不定长参数

def fun(a,b,*args):    print(a)    print(b)    print(args)fun(1,2)fun(1,2,3,4,5)

函数中的形参*args指向元组地址,当函数调用时传入参数大于定义的形参个数时,将多余的参数传入该元组中,fun()返回的args为一个空元组,而调用fun(1,2,3,4,5)时,将1传给a,2传给b,剩下多余的参数3,4,5传入args元组中。

def func(a,b,*args,**mkargs):
print(a)
print(b)
print(args)
print(mkargs)
func(1,2)
func(1,2,3,4,5)
func(1,2,3,4,5,mm=2,nn=6)
函数形参**mkargs为一个字典,当实参中有指定值时,将该指定值存入字典中,所以上面代码中func(1,2,3,4,5,mm=2,nn=6)返回结果中的mkargs={‘mm’:2,’nn’:6}

注意:
如果a是一个列表,则*a表示对列表解包([1,2,3]—>1,2,3),如果b是一个字典,则**b表示对字典解包({‘a’:’1’,’b’,’2’}—->’a’:’1’,’b’,’2’—->a=’1’,b=’2’)

5.引用

可变数据类型:列表、字典
不可变数据类型:数字、字符串、元组

可变数据类型数据的引用不变
而不可变类型数据的引用要变

字典的key值为不可变类型数据,不允许将key值赋值为可变类型数据。

6.函数传递引用

函数在传递参数时采用引用传递,即将实参引用传递给形参,实参与形参的引用相同,当函数中实参为不可变类型数据时,对参数进行修改,形参引用改变,形参引用指向另外一块内存空间;如果实参为可变数据类型时,函数中对形参进行修改时,形参的引用并不会改变,还是和实参引用相同。

注意:

def test(a):    print("a的id:",id(a))    a = a+a    print("a=a+a的id:",id(a))A = [11,22,33]print("A的id:",id(A))test(A)def test_1(a):    print("a的id:",id(a))    a += a    print("a+=a的id:",id(a))    print(a)A = [11,22,33]print()print()print("A的id:",id(A))test_1(A)

运行结果为:

D:\Python36\python.exe E:/demo_py/python/demo_3/id.pyAid: 1735494358472a的id: 1735494358472a=a+a的id: 1735494324808Aid: 1735494324808a的id: 1735494324808a+=a的id: 1735494324808[11, 22, 33, 11, 22, 33]进程已结束,退出代码0

可见在函数中a=a+a与a+=a最终a的id不一致,具有不同的效果。

二、局部变量和全局变量

1.局部变量

局部变量是只能在函数或代码段内使用的变量,函数或代码段一旦结束,局部变量的作用范围值在其被创建的函数内有效。例如,文件1的fun()中定义了一个局部变量,则该局部变量只能被fun()访问,而不能被fun2()访问,也不能被文件2访问。

def fun():    local = 1    print(local)fun()

调用函数fun()之后,local变量的作为范围已经超出。

python创建的变量就是一个对象,python会管理变量的声明周期,python对变量的回收采用垃圾回收机制。

2.全局变量

全局变量是能够被不同的函数、类或文件共享的变量,在函数之外定义的变量都可以成为全局变量。全局变量可以被文件内部的任何函数和外部文件访问。例如文件1中定义了一个全局变量,文件1中的函数fun()可以访问该全局变量。此外,该全局变量也能被文件1、文件2访问。

下面定义了两个全局变量_a、_b和两个函数add()、sub(),这两个函数将调用全局变量执行加法和减法计算。

#在文件的开头定义全局变量_a = 1_b = 2def add():    global _a    _a = 3     return "_a+_b",_a+_bdef sub():    global _b    _b = 4     return "_a-_b",_a-_bprint(add())print(sub())

代码中使用global关键字引用全局变量,调用函数add()可得结果为5,调用函数sub()可得结果为-1。

如果不使用global关键字引用全局变量,而是直接对_a、_b赋值,将得到不正确得结果。

#错误地使用全局变量_a = 1_b = 2def add():    _a = 3     return "_a+_b",_a+_bdef sub():    _b = 4     return "_a-_b",_a-_bprint(add())print(sub())

函数add()中的_a并不是前面定义的全局变量,而是函数add()中的局部变量。虽然输出的结果相同,但是运算对象并不相同,add()函数中的_b还是前面定义的全局变量_b。函数sub()中的_b是局部变量,sub()函数中的_a还是前面定义的全局变量。所以函数add()的结果为5,而函数sub()的结果为-3.

注意:
变量名相同的两个变量可能并不是同一个变量,变量的名称只是起标识的作用。变量出现的位置不同,变量的含义也不同。

应该尽量避免全局变量。因为不同的模块都可以自由地访问全局变量,可能会导致全局变量地不可预知性。全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖于全局变量。同样,全局变量降低了代码的可读性,阅读者可能不指导调用的某个变量是全局变量。

练习(对全局变量进行修改):

#全局变量的值在函数中不能直接修改,需要加上global关键字进行全局变量声明后才可对全局变量进行修改num = 100def test_1():    global num    print("num=",num)    num += 2    print("num=",num)def test_2():    print("test_2_num=",num)test_1()test_2()
阅读全文
0 0
原创粉丝点击