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.pyA的id: 1735494358472a的id: 1735494358472a=a+a的id: 1735494324808A的id: 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()
- python基础(函数、局部变量、全局变量、文件操作)
- Python新手学习基础之函数-全局变量和局部变量
- Python新手学习基础之函数-全局变量和局部变量
- Python学习之函数(全局变量和局部变量)
- python函数全局变量和局部变量
- Python 局部变量 全局变量 匿名函数 迭代器
- Python 全局变量 局部变量
- python基础:python的局部变量和全局变量
- static--修饰(局部变量、全局变量、函数)
- Python语法基础——关于全局变量与局部变量
- Python语法基础——关于全局变量与局部变量
- Python语法基础——关于全局变量与局部变量
- Python语法基础——关于全局变量与局部变量
- Python语法基础——关于全局变量与局部变量
- Python语法基础22.局部变量和全局变量
- JavaScript基础----16Javascript函数-局部变量和全局变量
- Python局部变量与全局变量
- python全局变量和局部变量
- json转换时间格式为一般格式
- css各种选择器,元素标签选择器,类选择器,id选择器,选择器的组合
- 统计各位数字之和是5的数
- Hinton大神Capsule论文首次公布,深度学习基石CNN或被取代
- 秋感
- python基础(函数、局部变量、全局变量、文件操作)
- VS安装Mono for Android的经典之作
- MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join
- Jsp页面验证上传文件的类型
- 10.28 test solution.
- MongoDB学习笔记(一) MongoDB介绍及安装
- IIS中fastcgi安装多版本php配置方法
- 如何彻底卸载Visual Studio
- 越狱手机syslog文件不存在或没有打印解决办法