网站首页 > 文章中心 > 其它

关于python函数结构是啥的信息

作者:小编 更新时间:2023-09-27 10:32:37 浏览量:465人看过

Python的函数都有哪些?

Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.

函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数.

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

关于python函数结构是啥的信息-图1

函数代码块以?def?关键词开头,后接函数标识符名称和圆括号().

任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数.

函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明.

函数内容以冒号起始,并且缩进.

return [表达式]?结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回 None.

语法

def functionname( parameters ): ? "函数_文档字符串"

关于python函数结构是啥的信息-图2

function_suite

return [expression]

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的.

实例

以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上.

def printme( str ): ? "打印传入的字符串到标准显示设备上"

print str

return

函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构.

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行.

如下实例调用了printme()函数:

# 定义函数def printme( str ): ? "打印任何传入的字符串"

# 调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")

以上实例输出结果:

我要调用用户自定义函数!再次调用同一函数

参数传递

在 python 中,类型属于对象,变量是没有类型的:

a="Runoob"

可更改(mutable)与不可更改(immutable)对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象.

python 函数的参数传递:

不可变类型:类似 c++ 的值传递,如 整数、字符串、元组.如fun(a),传递的只是a的值,没有影响a对象本身.比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身.

可变类型:类似 c++ 的引用传递,如 列表,字典.如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象.

python 传不可变对象实例

def ChangeInt( a ): ? ?a = 10

传可变对象实例

# 可写函数说明def changeme( mylist ): ? "修改传入的列表"

print "函数内取值: ", mylist

实例中传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果如下:

参数

以下是调用函数时可使用的正式参数类型:

必备参数

关键字参数

默认参数

不定长参数

必备参数须以正确的顺序传入函数.调用时的数量必须和声明时的一样.

调用printme()函数,你必须传入一个参数,不然会出现语法错误:

#可写函数说明def printme( str ): ? "打印任何传入的字符串"

#调用printme函数printme()

Traceback (most recent call last):

File "test.py", line 11, in module

printme()TypeError: printme() takes exactly 1 argument (0 given)

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值.

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值.

以下实例在函数 printme() 调用时使用参数名:

#调用printme函数printme( str = "My string")

My string

下例能将关键字参数顺序不重要展示得更清楚:

#可写函数说明def printinfo( name, age ): ? "打印任何传入的字符串"

print "Name: ", name

print "Age ", age

调用函数时,默认参数的值如果没有传入,则被认为是默认值.下例会打印默认的age,如果age没有被传入:

def functionname([formal_args,] *var_args_tuple ): ? "函数_文档字符串"

加了星号(*)的变量名会存放所有未命名的变量参数.不定长参数实例如下:

# 可写函数说明def printinfo( arg1, *vartuple ): ? "打印任何传入的参数"

print "输出: "

print arg1

for var in vartuple: ? ? ?print var

关于python函数结构是啥的信息-图3

匿名函数

python 使用 lambda 来创建匿名函数.

lambda只是一个表达式,函数体比def简单很多.

lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.

lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数.

虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率.

lambda函数的语法只包含一个语句,如下:

如下实例:

return 语句

return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的return语句返回None.之前的例子都没有示范如何返回数值,下例便告诉你怎么做:

print "函数内 : ", total

return total

变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的.访问权限决定于这个变量是在哪里赋值的.

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称.两种最基本的变量作用域如下:

全局变量

局部变量

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域.

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问.调用函数时,所有在函数内声明的变量名称都将被加入到作用域中.如下实例:

print "函数内是局部变量 : ", total

Python其实很简单 第十二章 函数与变量的作用域

在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如input()、range()等都是函数,这些都是Python的标准函数,直接使用就可以了.根据需要,用户也可以自定义函数.

函数的结构:

def 函数名(参数):

函数体

return 返回值

def f(x):

return(y)

下面给出完整的程序代码:

print(res)

运行结果:11

上例中的y是函数f(x)的返回值.并不是所有的函数都有参数和返回值.如下面的函数:

def func():

print('此为无参数传递、无返回值的函数')

func()

输出结果:此为无参数传递、无返回值的函数

可以看出,该函数func()无参数,故调用时不用赋给参数值.

def f(x,y):

return z

也可以通过直接给参数列表中的参数赋值的方法,为参数添加默认值,如果用户赋予参数值,则按照用户赋值执行,否则使用默认值.例如:

回调函数,又称函数回调,是将函数作为另一函数的参数.

例如:

def func(fun,m,n):

fun(m,n)

def f_add(m,n):

print('m+n=',m+n)

def f_mult(m,n):

print('m*n=',m*n)

输出结果:

在f_add(m,n)和f_mult(m,n)被定义前,func(fun,m,n)中的fun(m,n)就已经调用了这两个函数,即"先调用后定义",这也是回调函数的特点.

如果无法预知参数的个数,可以在参数前面加上*号,这种参数实际上对应元组类型.譬如,参会的人数事先不能确定,只能根据与会人员名单输入:

def func(*names):

print('今天与会人员有:')

for name in names:

print(name)

func('张小兵','陈晓梅','李大海','王长江')

运行后,输出结果为:

今天与会人员有:

张小兵

陈晓梅

李大海

王长江

参数为字典类型,需要在参数前面加上**号.

def func(**kwargs):

for i in kwargs:

print(i,kwargs[i])

func(a='a1',b='b1',c='c1')

输出结果为:

a a1

b b1

c c1

一个有趣的实例:

def func(x,y,z,*args,**kwargs):

print(x,y,z)

print(args)

print(kwargs)

func('a','b','c','Python','is easy',py='python',j='java',ph='php')

a b c # 前三个实参赋给前三个形参

('Python', 'is easy') # *args接收元组数据

{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典数据

变量的作用域即变量的有效范围,可分为全局变量和局部变量.

在函数中定义的变量就是局部变量,局部变量的作用域仅限于函数内部使用.

在主程序中定义的变量就是全局变量,但在函数中用关键字global修饰的变量也可以当做全局变量来使用.

全局变量的作用域是整个程序,也就是说,全局变量可以在整个程序中可以访问.

下面通过实例去讨论:

程序1:

a=1 # a为全局变量

def a_add():

print('a的初值:',a) # 在函数中读取a的值

a_add() # 调用函数a_add()

a+=1 # 主程序语句,a增加1

print('a现在的值是:',a) # 主程序语句,读取a的值

运行结果:

a的初值: 1

这个结果和我们想象的一样,全局变量a既可以在主程序中读取,也可以在子程序(函数)中读取.

a=1

a+=1

print('a的初值:',a)

a_add()

print('a现在的值是:',a)

运行程序1时出现如下错误提示:

UnboundLocalError: local variable 'a' referenced before assignment

意思是:局部变量'a'在赋值之前被引用.

怎样解决这个问题?

def a_add(x):

x+=1

return x

a=a_add(a)

结果的确是正确的,但在函数a_add(x)中没有调用变量a(没有出现变量a).

def a_add(a):

return a

global a

虽然使用global可使变量使用起来非常方便,但也容易引起混淆,故在使用过程中还是谨慎为好.

递归,就是函数调用它自身.递归必须设置停止条件,否则函数将无法终止,形成死循环.

以计算阶乘为例:

def func(n):

if n==1:

return 1

else:

return n*func(n-1) #func( )调用func( )

嵌套,指在函数中调用另外的函数.这是程序中常见的一种结构,在此不再赘述.

Python中可以在参数前加上关键字lambda定义一个匿名函数,这样的函数一般都属于"一次性"的.

程序1:这是一个常规的函数定义和调用.

def f_add(x,y):

return x+y

f_add=lambda x,y:x+y

Python函数的定义(构造)和调用

这里来给大家演示一下,函数的定义或构造,并调用函数来实现封装后的效果.

首先我们来看看想实现下面的这个效果,如果不使用函数应该怎么实现.

以上两种方法,第一种代码重复率太高,代码美观效果太差,虽然能实现效果,但是因为数量比较少,还能手工打出来这几行代码,如果是打印1-100000就很难实现了.这时候for循环还是可以实现的,但是for循环只能实现类似的数字和变量循环,无法进行复杂的功能开发.鉴于此,函数这个概念就被python引入了,下面先来看看函数是怎么实现上面的效果的,还是两种方法.

这时候如果想实现上面的打印结果就直接使用函数名+小括号调用函数就可以了,这种类型的语法,不仅可以反复使用,而且封装后的代码更美观.

Python构造函数

类是对象的模板,是抽象的.

构造函数 init 是Python魔术方法之一,如图魔术方法

我们通过类模版去创建类的实例对象,然后再调用类定义的功能.

那实例对象的属性是通过什么来初始化的?

这时候Python引入来构造函数 init

构造函数,会在创建实例对象之后Python会自动执行此方法,把初始化的属性特点放到实例对象里.

通过前面的学习,我们知道一个python对象包含三个部分:id(识别码),type(对象类型),value(对象的值)

那么我们进一步深入对象包含的三部分:

我们通过类创建实例对象后,需要定义构造函数 init ()方法.

构造方法用于执行实例对象的初始化工作,即对象创建之后,初始化当前对象的相关的属性,无返回值

构造函数重点 :

我们通过栗子来学习构造函数的过程

构造函数初始化实例对象过程如下:

①Animal类会通过默认的 new ()方法为实例对象在堆内存中为开辟一个空间

敲黑板,重点来啦~

拓展:

我们今天学习了构造函数 init (),其在创建对象之后被Python自动调用初始化实例对象属性数据值,无返回值,并且构造函数不能被显示调用.

创建对象时,如果需要,构造函数可以接受参数.当创建没有构造函数的类时,Python会自动创建一个不执行任何操作的默认构造函数.

每个类必须有一个构造函数,即使它只依赖于默认构造函数

好啦,好了,全部的本期内容,欢迎大佬评论区指正~

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章