python中的自省函数 Python的自定义函数
怎样理解python中的函数,用户自定义函数有什么意义?
函数是什么?
壶关网站建设公司创新互联,壶关网站设计制作,有大型网站制作公司丰富经验。已为壶关近千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设要多少钱,请找那个售后服务好的壶关做网站的公司定做!
定义:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
作用:函数能提高应用的模块性和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
函数是 python 的一等公民,函数也是对象。
使用函数有两个步骤:
1、定义函数 def 函数名(): 函数体
2、调用函数 函数名()
什么是python中的自省
自省就是程序运行时能够知道对象的类型,比如type()/isinstance()/hasattr()这种函数
Python中定义函数的使用方法?
4.6. 定义函数
我们可以创建一个用来生成指定边界的斐波那契数列的函数:
def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
# Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
关键字 def 引入了一个函数 定义。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。
函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring。(更多关于 docstrings 的信息请参考 文档字符串) 有些工具通过 docstrings 自动生成在线的或可打印的文档,或者让用户通过代码交互浏览;在你的代码中包含 docstrings 是一个好的实践,让它成为习惯吧。
函数 调用 会为函数局部变量生成一个新的符号表。确切的说,所有函数中的变量赋值都是将值存储在局部符号表。变量引用首先在局部符号表中查找,然后是包含函数的局部符号表,然后是全局符号表,最后是内置名字表。因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。
函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。[1] 一个函数被另一个函数调用时,一个新的局部符号表在调用过程中被创建。
一个函数定义会在当前符号表内引入函数名。函数名指代的值(即函数体)有一个被 Python 解释器认定为 用户自定义函数 的类型。 这个值可以赋予其他的名字(即变量名),然后它也可以被当作函数使用。这可以作为通用的重命名机制:
fib
f = fib
f(100)
0 1 1 2 3 5 8 13 21 34 55 89
如果你使用过其他语言,你可能会反对说:fib 不是一个函数,而是一个方法,因为它并不返回任何值。事实上,没有 return 语句的函数确实会返回一个值,虽然是一个相当令人厌烦的值(指 None )。这个值被称为 None (这是一个内建名称)。如果 None 值是唯一被书写的值,那么在写的时候通常会被解释器忽略(即不输出任何内容)。如果你确实想看到这个值的输出内容,请使用 print() 函数:
python语言中的内建函数dir()是干啥用的啊?
dir() 函数
尽管查找和导入模块相对容易,但要记住每个模块包含什么却不是这么简单。您并不希望总是必须查看源代码来找出答案。幸运的是,Python 提供了一种方法,可以使用内置的 dir() 函数来检查模块(以及其它对象)的内容。
dir() 函数可能是 Python 自省机制中最著名的部分了。它返回传递给它的任何对象的属性名称经过排序的列表。如果不指定对象,则 dir() 返回当前作用域中的名称
python中的函数和类的区别
类,class,用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
函数,是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
python语言中类和函数的区别是什么?
1、规则不同
类是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型;
函数必须声明后才可以被调用,调用格式为:函数名(实参)调用时函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。
2、主体不同
类是面向对象程序设计实现信息封装的基础;
函数是指一段在一起的、可以做某一件事的子程序。
3、特点不同
类是一种用户定义的引用数据类型,也称类类型,每个类包含数据说明和一组操作数据或者传递消息的函数,类的实例称为对象;
函数分为全局函数、全局静态函数,在类中还可以定义构造函数、析构函数、拷贝构造函数、成员函数、友元函数、运算符重载函数、内联函数等。
Python 有哪些新手不会了解的深入细节
从开始看Python到现在也有半个多月了,前后看了Python核心编程和DiveintoPython两本书。话说半个月看两本,是个人都知道有多囫囵吞枣,这也是因为我暂时没有需求拿这个做大型开发,主要是平时的小程序test用一用。所以我的策略是,整体浏览,用到时候现查。话说这核心编程第一版太古老了,老在讲2.2之前的东西,我看的翻译电子版,翻译得也不好,很晦涩。看完这个后还有点云里雾里,看网上人家说DIP好,啄木鸟还有免费电子文档,就找来看这个。怎么说呢,讲的比核心编程好,但不适合第一次看的初学者。我之所以觉得讲得好,是因为看核心编程,有些概念还有些模糊,看了这本书就明白不少了。要是初学者上来就看这本,保证不好理解。下面就是在学习的过程中,在翻阅资料的过程中,总结的一些C和python比较明显的不同之处,有大方向的,也有细节的。肯定没有总结完,比如动态函数,lambda这些,我都懒得往上写了。实际上,作为两种完全不同的语言,下面这些差异只是冰山一角而已。权当抛砖引玉吧,至少应该对和我有相同研究兴趣,正在考虑是否学习另一门语言的朋友有点帮助。此文也算是DIP的学习笔记吧。顺带说一句,要是有朋友了解,可以帮忙推荐一下实战性强的Python教材,语言这东西,不多练手,光比划,是不可能学好的。学习目的我的以后的研究方向是嵌入式,显然,C语言是我的主要语言。我不是一个语言爱好者,我以前觉得,对于做研究而不是应用的人来说,了解多门语言,不如精通一门语言。之所以去看python,主要还是因为python更有利于快速开发一些程序,也是因为现在认识到,研究和应用是不能分离的。个人以为,要想在计算机工程的竞争中立足,必须懂C语言。因为真正要做高性能编程,不可能将机器的体系架构抛到脑后让Python虚拟机(或Java虚拟机等)帮你搞定所有底层。越来越多的CPUcore,越来越恐怖的内存性能瓶颈,对于上层开发人员来说,无所谓,但是对高性能程序开发人员来说,这些是无法透明的。很多应用,还是自己掌控比较有效。这些场合中,汇编和C还是不可替代的。但是,光知道C是不够的,掌握一门面向对象语言,相对更高层的语言,不仅对以后的个人发展有利,也会对自己的技术认识产生帮助。如果要问对我来说谁更重要,我觉得还是C更重要。C的学习曲线更陡,貌似简单,实际上到处都是陷阱,看上去比较简单低效的程序,也不是学1,2个月就能搞定的。谈到优化的深层次和难度嘛,需要的功底是按年算的。但是一旦你C语言的基础打好了,对计算机的理解,对其他语言的理解都是大有裨益的。比如,如果你有C基础,可以说,学过1天python,就能写的出来一些不短的程序。后面的优化也不是什么大不了的算法,都是非常基本的语句换来换去。当然这里不是说Python不好,实际上,上层应用,Python比C方便的不是一个层次。很多人觉得,既然懂C了,那么进一步掌握C++应该是水到渠成,但C++不是C的超集,而我又不喜欢C++的繁琐和巨大,所以才决定看一看Python。我很喜欢Python的优雅与快捷。语言类型和C不一样,Python是一种动态类型语言,又是强类型语言。这个分类怎么理解呢?大概是可以按照下列说明来分类的:静态类型语言一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java和C是静态类型语言。动态类型语言一种在运行期间才去确定数据类型的语言,与静态类型相反。Python是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。强类型语言一种总是强制类型定义的语言。Java和Python是强制类型定义的。您有一个整数,如果不明确地进行转换,不能将把它当成一个字符串。弱类型语言一种类型可以被忽略的语言,与强类型相反。VBScript是弱类型的。在VBScript中,您可以将字符串‘12′和整数3进行连接得到字符串’123′,然后可以把它看成整数123,所有这些都不需要任何的显示转换。对象机制具体怎么来理解这个“动态确定变量类型”,就要从Python的Object对象机制说起了。Objects(以下称对象)是Python对于数据的抽象,Python中所有的数据,都是由对象或者对象之间的关系表示的,函数是对象,字符串是对象,每个东西都是对象的概念。每一个对象都有三种属性:实体,类型和值。理解实体是理解对象中很重要的一步,实体一旦被创建,那么就一直不会改变,也不会被显式摧毁,同时通常意义来讲,决定对象所支持的操作方式的类型(type,包括number,string,tuple及其他)也不会改变,改变的只可能是它的值。如果要找一个具体点的说明,实体就相当于对象在内存中的地址,是本质存在。而类型和值都只是实体的外在呈现。然后Python提供一些接口让使用者和对象交互,比如id()函数用来获得对象实体的整形表示(实际在这里就是地址),type()函数获取其类型。这个object机制,就是c所不具备的,主要体现在下面几点:1刚才说了,c是一个静态类型语言,我们可以定义inta,charb等等,但必须是在源代码里面事先规定。比如我们可以在Python里面任意一处直接规定a=“lk”,这样,a的类型就是string,这是在其赋值的时候才决定的,我们无须在代码中明确写出。而在C里面,我们必须显式规定char*a=“lk”,也就是人工事先规定好a的类型2由于在C中,没有对象这个概念,只有“数据的表示”,比如说,如果有两个int变量a和b,我们想比较大小,可以用a==b来判断,但是如果是两个字符串变量a和b,我们就不得不用strcmp来比较了,因为此时,a和b本质上是指向字符串的指针,如果直接还是用==比较,那比较的实际是指针中存储的值——地址。在Java中呢,我们通过使用str1==str2可以确定两个字符串变量是否指向同一块物理内存位置,这叫做“对象同一性”。在Java中要比较两个字符串值,你要使用str1.equals(str2)。然后在Python中,和前两者都不一样,由于对象的引入,我们可以用“is”这个运算符来比较两个对象的实体,和具体对象的type就没有关系了,比如你的对象是tuple也好,string也好,甚至class也好,都可以用”is”来比较,本质上就是“对象同一性”的比较,和Java中的==类似,和C中的pointer比较类似。Python中也有==比较,这个就是值比较了。3由于对象机制的引入,让Python的使用非常灵活,比如我们可以用自省方法来查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。这些操作在C中都是不可想象的。4还有一个很有意思的细节,就是类型对对象行为的影响是各方面的,比如说,a=1;b=1这个语句中,在Python里面引发的,可能是a,b同时指向一个值为1的对象,也可能是分别指向两个值为1的对象。而例如这个语句,c=[];d=[],那么c和d是肯定指向不同的,新创建的空list的。没完,如果是”c=d=[]“这个语句呢?此时,c和d又指向了相同的list对象了。这些区别,都是在c中没有的。最后,我们来说说为什么python慢。主要原因就是functioncalloverhead比较大。因为所有东西现在都是对象了,contruct和destroy花费也大。连1+1都是functioncall,像’12′+’45′这样的要createathirdstringobject,thencallsthestringobj’s__add。可想而知,速度如何能快起来?列表和数组分析Python中的list和C中的数组总是很有趣的。相信可能一些朋友和一样,初学列表的时候,都是把它当作是数组来学的。最初对于list和数组区别的定性,主要是集中在两点。首先,list可以包含很多不同的数据类型,比如["this",1,"is","an","array"]这个List,如果放在C中,其实是一个字符串数组,相当于二维的了。其次呢,list有很多方法,其本身就是一个对象,这个和C的单纯数组是不同的。对于List的操作很多样,因为有方法也有重载的运算符。也带来一些问题,比如下面这个例子:加入我们要产生一个多维列表,用下面这个语句A=[[None]*2]*3结果,A的值会是[[None,None],[None,None],[None,None]]初一看没问题,典型的二维数组形式的列表。好,现在我们想修改第一个None的值,用语句A[0][0]=5现在我们再来看看A的值:[[5,None],[5,None],[5,None]]发现问题没有?这是因为用*来复制时,只是创建了对这个对象的引用,而不是真正的创建了它。*3创建了一个包含三个引用的列表,这三个引用都指向同一个长度为2的列表。其中一个行的改变会显示在所有行中,这当然不是你想要的。解决方法当然有,我们这样来创建A=[None]*3foriinrange(3):A[i]=[None]*2这样创建了一个包含三个不同的长度为2的列表。所以,还是一直强调的,越复杂的东西,越灵活,也越容易出错。代码优化C是一个很简单的语言,当我们考虑优化的时候,通常想得也很简单,比如系统级调用越少越好(缓冲区机制),消除循环的低效率和不必要的系统引用,等等,其实主要都是基于系统和硬件细节考虑的。而Python就完全不一样了,当然上面说的这些优化形式,对于Python仍然是实用的,但由于Python的语法形式千差万别,库和模块多种多样,所以对于语言本身而言,就有很多值得注意的优化要点,举几个例子吧。比如我们有一个listL1,想要构建一个新的listL2,L2包括L1的头4个元素。按照最直接的想法,代码应该是L2=[]foriinrange[3]:L2.append(L1[i])而更加优化和优美的版本是L2=L1[:3]再比如,如果s1..s7是大字符串(10K+),那么join([s1,s2,s3,s4,s5,s6,s7])就会比s1+s2+s3+s4+s5+s6+s7快得多,因为后者会计算很多次子表达式,而join()则在一次过程中完成所有的复制。还有,对于字符串操作,对字符串对象使用replace()方法。仅当在没有固定字符串模式时才使用正则表达式。所以说,以优化为评判标准,如果说C是短小精悍,Python就是博大精深。include和import在C语言中的include非常简单,因为形式单一,意义明确,当你需要用到外部函数等资源时,就用include。而Python中有一个相似的机制,就是import。乍一看,这两个家伙挺像的,不都是我们要用外部资源(最常见的就是函数或者模块(Python))时就用这个来指明么?其实不然,两者的处理机制本质区别在于,C中的include是用于告诉预处理器,这个include指定的文件的内容,你都给我当作在本地源文件中出现过。而import呢,不是简单的将后面的内容*直接*插入到本地里面去,这玩意更加灵活。事实上,几乎所有类似的机制,Python都比C灵活。这里不是说C不好,C很简练,我其实更喜欢C。简单说说这个灵活性。import在python中有三种形式,importX,fromXimport*(ora,b,c……),X=__import__(’x')。最常用的是第二种,因为比较方便,不像第一种那样老是用X.module来调用模块。fromXimport*只是import那些public的module(一般都是不以__命名的模块),也可以指定a,b,c来import。什么时候用哪一种形式呢?应该说,在大多数的模块文档里,都会明确告诉你应该用哪种形式。如果需要用到很多对象,那么fromXimport*可能更合适一些,但是,就目前来看,大多数第三方Python库都不推荐使用frommodulenameimport*这种格式。这样做会使引入者的namespace混乱。很多人甚至对于那些专门设计用于这种模式的模块(包括Tkinter,threading和matplot)都不采用这种方式。而如果你仅仅需要某个对象类a,那么用fromXimporta比用importX.a更好,因为以后你调用a的函数直接用a.function()既可以了,不用加X。如果你连自己希望import的模块都不知道怎么?请注意,此时Python的优势就体现出来了,我们可以用__import__(module)来调用module,其中这个module是字符串,这样,可以在运行时再决定,你到底要调用什么module。举个例子:defclassFromModule(module,Name):mod=__import__(module)returngetattr(mod,Name)这里,定义了一个函数classFromModule,你可以在代码的任何时候调用它,o=classFromModule(ModuleOfTheClass,NameOfTheAttribute)()只需要传入字符串形式的你希望import的模块ModuleOfTheClass和其中属性的名字NameOfTheAttribute(当然可以是数据也可以是方法),就能调用了,这个名字字符串不用事先指定,而是根据当时运行的情况来判断。顺带说一句,Python中import的顺序也有默认规定,这个和C中的include有点类似,因为我们一般都是先include系统文件,再include自己的头文件(而且还有和“”的区别)。Python中呢,一般应该按照以下顺序import模块:1.标准库模块—如sys,os,getopt等2.第三方模块3.本地实现的模块。全局变量这里谈全局变量呢,倒不是说Python和c的全局变量概念不同,他们的概念是相同的。只是在使用机制上,是有一些差异的。举个例子:–module.py–globalvar=1deffunc():printglobalvar#Thismakessomeglobalreadonly,#anyattempttowritetosomeglobal#wouldcreateanewlocalvariable.deffunc2():globalglobalvarglobalvar=2#thisallowsyoutomanipulatetheglobal#variable在func这个函数中,globalvar是只读的。如果你使用了globalvar=xxx这种赋值语句,Python会重新创造一个新的本地对象并将新值赋给它,原来的对象值不变。而在func2函数中,由于我们事先申明了globalvar是global的,那么此时的更改就直接在全局变量上生效。
本文题目:python中的自省函数 Python的自定义函数
文章网址:http://hbruida.cn/article/hghodh.html