Python基础笔记系列九:变量、自定义函数以及局部变量和全局变量
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!
- 变量
在前面的系列中也许就可以发现,python中的变量和C中的变量有些许不同。比如在C中:
例子:#include <stdio.h> int main(void)
{
/* code */
int a,b,c;
int *p,*q,*t; a = ,b=,c=;
p = &a;
q = &b;
t = &c;
printf("%d\n",p);
printf("%d\n",q);
printf("%d\n",t);
return ;
}输出:
从输出结果可以看出,虽然a和c的值是一样的,但是a和c的地址是不同的。也就是说a开始赋值为5开辟了一块空间,当c赋值为5时又会给它分配一块空间。
但是在python 中就不同,如下的例子。
例子:#----------变量--------
a = 5
b = 8
c = 5
print id(a) #id(变量名) 用于取变量的地址
print id(b)
print id(c)输出:
86995552
86995516
86995552从上面两个例子中我们可以看出区别:
1)c语言中定义变量需要定义变量类型,具体这个变量是int、long还是char等等,而python中不关心变量的类型,直接定义变量,它会自己寻找最合适的类型进行存储,可通过type(变量名)来查看变量的类型,在前面的系列中也可以看出python的变量没有类型,比如定义一个字符串str则可以直接:str = "hello"。
2)c语言中定义变量时不管内存空间中有没有这个值都会重新开辟一块新的空间,而python中如果在内存空间中存在一个相同的值,就不会开辟新空间,直接将变量指向这块空间。 - 自定义函数
一、函数的定义规则
#1.def定义函数 2.函数后有":"号 3.以代码缩进表示函数体#def 函数名(参数名):
# '注释内容'
# 执行语句
# return
例子1:def add(x,y):
z = x + y
return z result = add(3,5)
print result输出:8
例子2:def printName(str):
'打印任意传入的参数'
print str
return输出:
你好,python
二、函数的调用
1.如果函数在于另一个模块中,则需要import导入模块才能调用;
2.如果函数在当前模块中,则可以直接调用。#如果函数在单独的一个文件 需要先import 文件名
printName('你好,python') #调用函数
#比如通过help 查看函数中的注释内容,其实就是使用了python的help函数
print help(printName)三、函数的值传递和引用传递
在此之前要知道函数的参数有两种:形参和实参
形参:在函数定义时的变量成为函数的形参,形参主要用于接收调用方传递过来的值或引用;
实参:函数调用时的实际参数。
函数的值传递也就是实实在在值的传递问题。
例子:def function1(var):
'按值传递,修改值'
var = 100
print 'id= ',id(var)
print '函数内取值:',var
return var =5
function1(var) #调用函数
print 'id= ',id(var)
print '函数外取值:',var #输出:
id= 89814444
函数内取值: 100
id= 89813600
函数外取值: 5函数的引用传递传的是一个引用,如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也改变了。
例子:def changeme(mylist):
'修改传入的列表'
# mylist =[1111,222,333] #重新进行了赋值操作,变为值传递
mylist.append([1,2,3,4])
print 'id= ',id(mylist)
print '函数内取值:',mylist
return mylist = [4,5,6,7]
changeme(mylist) #调用函数
print 'id= ',id(mylist)
print '函数外取值:',mylist #输出:
id= 91525568
函数内取值: [4, 5, 6, 7, [1, 2, 3, 4]]
id= 91525568
函数外取值: [4, 5, 6, 7, [1, 2, 3, 4]]从上面两个例子中可以看出,其实就是说如果在函数里面对传进来的这个变量进行了赋值(就有了不同空间地址),那么函数内部这个变量的值就改变了,而函数外部还是没有变化,这就是值传递。如果函数里面对传进来的那个变量只是在他原本的基础上(同一块地址上)进行操作,那么函数内部这个变量的值就改变了,而函数外部也跟着变化,这就是引用传递。从C语言的角度来说,值传递和或引用传递也就是地址或值的改变。(个人这样认为,如果你有更好的见解欢迎教小弟一把~底部有联系方式)
四、函数的参数类型
python函数的参数类型主要有四种:必备参数、命名参数、缺省参数、不定长参数。
必备参数:调用方必须以正确顺序传入参数,且数量要和声明时的一样;
命名参数:调用方用参数的命名确定传入的参数值
缺省参数:函数的参数可以设置默认值,如果设置了默认值则调用方可以不给它传参而使用默认值
不定长参数:一个函数可以处理比当初声明时更多的参数,这些参数就是不定长参数
例子:#1必备参数
def printA(a,b):
'打印任意传入的参数'
print a + b
return
printA(1,2) #调用函数
print '-'*30
#2命名参数
def printA(a,b):
'打印任意传入的参数'
print a + b
return
printA(b=1,a=2) #调用函数
print '-'*30
#3缺省参数
def printB(a,b=5): #设置了默认值
'打印任意传入的参数'
print 'a=%d'%a
print 'b=%d'%b
return
printB(1) #只传了一个参数,则b使用默认值
printB(1,2) #若传了两个参数,则不使用默认值输出:
3
------------------------------
3
------------------------------
a=1
b=5
a=1
b=2不定长参数是一个函数可以处理比当初声明时更多的参数,不定长参数有两种定义方式。一种是将不定长参数匹配为元组,另一种是将不定长参数匹配为字典。
例子:#不定长参数匹配为元组
def arglist(a,*b): #不定长参数用*号定义 其本质为一个元组
print a
print b
return
arglist(1,2,3,5,6) #第一个匹配a,后面的就是一个元组b print '-'*30
#不定长参数匹配为字典(key-value)
#例1
def arglist1(a,**b): #不定长参数用**号定义 其本质为一个字典
print a
print b
return
arglist1(1,x=2,y=3) #第一个匹配a,后面的就是一个字典b #例2
def arglist2(**a): #不定长参数用**号定义 其本质为一个字典
print a
for key in a:
print key+' = '+ str(a[key])
return
arglist2(x=2,y=3,z=5) print'-'*30输出:
1
(2, 3, 5, 6)
------------------------------
1
{'y': 3, 'x': 2}
{'y': 3, 'x': 2, 'z': 5}
y = 3
x = 2
z = 5五、函数的return语句
python不同与其它编程语言,它的return语句可以返回多个返回值,返回多个值放在一个元组中。
例子:def arglist3():
print 'call this function'
return 1,2,3,4,5 res = arglist3() #调用方法
print res #打印返回值(元组)
print res[0:3] #同样可以操作这个元组输出:
call this function
(1, 2, 3, 4, 5)
(1, 2, 3)六、匿名函数
匿名函数,顾名思义就是没有名字的函数,在python中使用lambda表达式定义。#1.得名于省略了用def声明函数的标准步骤
#2.Lambda函数能接收任何数量的参数但只能返回一个表达式的值
#3.不能包含多个命令和表达式
#4.匿名函数不能直接调用print ,因为lambda需要一个表达式,所以需要一个变量来存表达式的值
#5.lambda函数拥有自己的名字空间,且不能访问自由参数列表之外或全局名字空间里的参数
#6.lambda函数的语法只包含一个语句,例如,函数名=lambda [参数1,参数2,...] :表达式
例子:sum = lambda arg1,arg2 : arg1+arg2
print sum(5,3) #调用sum函数
print type(sum)输出:
8
<type 'function'> 局部变量和全局变量
一般地,在函数体内部定义的变量是局部变量,只能在函数体内部访问(可以使用global关键字将局部变量定义为全局变量),而不包含于任何一个函数的,或者说是与main函数属于同一级的是全局变量,可以在main函数中任何地方使用(如果要在某函数体内部修改全局变量的值,使用global关键字)。
函数在调用时就会全部解析函数体,如果函数体内有定义和全局变量同名的局部变量,则函数体使用的是局部变量,在定义之前使用则会出错;但是如果整个函数体都没有定义该变量,它可以直接调用全局变量
例子:def function1():
#print num1 #在定义之前打印(报错)
num1 = 10
global num2
num2 = 20
print num1
num1=5
function1()
print num1
print num2 #调用全局变量num2输出:
10
5
20
Python基础笔记系列九:变量、自定义函数以及局部变量和全局变量的更多相关文章
- Python基础笔记系列十一:标准输入输出、文件读写和指针等操作
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...
- Python基础笔记系列一:基本工具与表达式
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...
- Python基础笔记系列十:模块
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...
- Python基础笔记系列四:工具的安装与配置
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 一开始是没有打算写工具这篇的,后来发现在某些情况下会遇到一些奇怪的问题,这 ...
- Python学习笔记一:变量、函数
变量.函数是Python语言的最基本单元,下面是我作为初学者的当前理解,随着学习的深入今后会做刷新. 变量:表示操作对象是谁. 变量的方法:表示能做什么事情. 如何设计变量:先分析需要解决的问题,基于 ...
- Python基础笔记系列十四:python无缝调用c程序
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python语言可以对c程序代码进行调用,以弥补python语言低性能的缺 ...
- Python基础笔记系列三:list列表
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...
- Python基础笔记系列十三:socket网络编程
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!!使用python编写一个简易的服务端程序和客户端程序,启动服务端和客户端(监 ...
- Python基础笔记系列十二:requests模块的简单应用
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! httpbin httpbin这个网站能测试 HTTP 请求和响应的各种信 ...
随机推荐
- Flask之session相关
Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...
- 深入浅出MySQL-DDL语句
DDL语句 DDL是数据定义语言的缩写,简单来说,就是对数据库内部的对象进行创建.删除.修改等操作的语言.它和DML(数据操纵语言)的最大区别是DML知识对表内部的数据操作,而不涉及表的定义.结构的修 ...
- kettle配置命名参数
bat 调度文件如下 cd D:/Program Files/kettle700/data-integrationKitchen.bat /rep repository /dir /TEST /job ...
- Get a better look at the 2014 Nike Hyperrev
There's a couple of Nike Hyperrev For Sale Delay climax frames lead that will list for this calendar ...
- oracle 数据库误删数据,误删表的恢复
1.某表的数据误删了,那么可以查询这个表某一时间节点之前的数据,并放到一个新建的表里. create table temptable as select * from t_billdefi as O ...
- 160726 smarty 笔记(1)
模板里面显示变量:1.变量要写在Smarty标记之间,变量名以$开头<{$test}>2.支持所有类的数据,包括数组(关联数组),对象关联数组在模板显示的时候,除了可以使用php语法之外, ...
- kubenetes 应用更新
一.Deployment类型: 1.更新: 1).命令方式更新镜像: kubectl set image deployment nginx-deployment nginx=nginx:1.9.1 k ...
- mysql5.7 linux安装参考
安装参考: https://www.cnblogs.com/ianduin/p/7679239.html http://blog.csdn.net/wb96a1007/article/details/ ...
- 对于JVM中方法区,永久代,元空间以及字符串常量池的迁移和string.intern方法
在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...
- Swoole学习(二)Swoole之TCP服务器的创建
环境:Centos6.4,PHP环境:PHP7 <?php //创建TCP服务器 /** * $host 是swoole需要监听的ip,如果要监听本地,不对外服务,那么就是127.0.0.1;如 ...