在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如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
(1)简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,如有全局同名变量,其值不变.
*<
如何查看 Python 全部内置变量和内置函数?
按下回车键(Enter).
import builtins
dir(builtins)
得到的结果和 dir(__builtins__) 是一样的.
可以看到,返回的结果是以 [ 开头以 ] 结尾,说明是个列表,我们看看这列表里一共有多少个元素?
输入:
len(dir(__builtins__))
for item in dir(__builtins__):
print(item)
按下两次回车键(Enter).按照默认的字母顺序,先是大写字母 A-Z,然后是下划线(_)开头的,然后是小写字母 a-z ,为什么是这个顺序?因为按照 ASCII 码表,表示小写字母的数字比表示大写字母的数字要大,而表示下划线(_)的数字居中,所以如此.
print('Hello World')
builtins.print('Hello World')
__builtins__.print('Hello World')
运行结果如下,可以看到,结果是一样的.
dir()本身就是 Python 的内置函数,利用它,我们可以查看对象的全部方法和属性,对于掌控全局,了解全貌很有用.
课程推荐:Python快速教程之从入门到精通
def 函数名():? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ?函数体? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ?return? 返回值? ? ? ? ? ? ? ? ? ? ? ? ? ?
def 函数名(非可选参数,可选参数):
?函数体?
??return 返回值
def 函数名(参数,*b):
? ? ? 函数体
? ? ? return 返回值
函数名 = lambda 参数 : 表达式
例1:f = lambda x , y? :? x ◆ y? ? ? ? ? ? ? ? ? ? ? ?
调用:?print(f())? ? 输出: 没有参数的lambda函数!
函数中定义的变量只能在函数体重起作用,Python在函数中定义的变量只能在该函数体中才可以起作用,只要出了这个函数,那么其他的地方就无法访问这个变量,因为该变量的作用域只在这个函数中,所以只在本函数体内有效.
因为定义了局部变量只能在其被声明的函数内部访问,要想在程序的全域进行访问只能通过定义全局变量的方法进行实现,这些只要在程序控制范围内都可以调用.
一般情况下变量就分为这两大类,一类是全局变量,一类是局部变量.
Python常用的控制语句:
①.、if语句,当条件成立时运行语句块.经常与else,elif(相当于else if)配合使用、for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素.
Python代码编写注意:
开发者有意让违反了缩进规则的程序不能通过编译,所以在进行Python代码的书写时一定要注意代码的缩进.
以上内容参考:百度百科-Python
函数是组织好,可重复使用的,用来实现相关功能的代码段
函数提高了代码的重复利用率和应用的模块性.
除Python自带的函数之外,也可以自己创建函数,叫做自定义函数
语法:
函数代码块以 def 开头
参数为 输入值 ,放于函数名后口号里面,
函数内容以冒号:开始,函数体缩进, return 返回 输出值
函数调用使用关键字参数来确定传入的参数值,此时,如果多个函数则不需要按照指定顺序.
在定义函数时,指定参数默认值.调用时如果不传入参数,则使用默认值
不定长部分如果没有指定参数,传入是一个空元组
加了 两个星号 ** 的参数会以字典的形式导入
/ 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式.
不使用 def 定义函数,没有函数名
lamdba主体时一个表达式,而不是代码块,函数体比def简单很多
定义在函数内部的为局部变量,仅能在函数内部使用
定义在函数外部的为全局变量,可在全局使用
模块是将包含所有定义的函数和变量的文件,一般将同类功能的函数组和在一起称为模块.
模块需要导入后,在调用相应函数进行使用
模块导入的方法:
从模块中导入一个指定的部分
把一个模块的所有内容全都导入