python的函数 您所在的位置:网站首页 python变量后加点和函数 python的函数

python的函数

#python的函数| 来源: 网络整理| 查看: 265

一、函数的定义?? ??? ?函数是组织好的,可重复使用的,用来实现一定功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。 ?二、函数定义及其语法函数代码块以def关键词开头,后接函数名称和圆括号() 传入的任何参数和自变量放在圆括号()中间 函数的内容以冒号起始,并且缩进 函数的第一行语句可以选择性的使用文档字符串————用于存放函数说明 return 【表达式】结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回None 函数使用原则:先定义,再调用 语法:def 函数名(参数1,参数2,参数3,...): 函数体 return 返回的值 函数名() 注意:函数名要能反映其意义

?示例:

def func(): #函数的定义 print("Hello wprld") func() #函数的调用(调用就是函数名加上括号)

?

三、函数的返回值

return语句【表达式】退出函数(结束一个函数的执行),选择性地向调用方返回一个表达式。

返回值可以是任意数据类型。

如果函数有返回值,必须使用变量接收才有效果。

返回值情况:

1,返回值为None的情况

当不写return时,默认返回值为None

return不加参数时,返回None

return None

2,返回值不为None的情况

返回一个值: return xxx 返回一个值(一个变量) 任意数据类型

返回多个值: return a,b,[1,2,3] ; 用一个变量接收时返回的是一个元祖,也可以用相应数量的变量去接收, 可以返回任意多个、任意数据类型的值

?

示例:

不写return时,默认返回值为None def func(): #函数定义 s ="hello world" print(s) str = func() #函数调用 print('str: %s'%str) #因为没有返回值,此时的str_len为None 运行结果: hello world str: None return不加参数时,返回None def func(): s ="hello world" print(s) return str = func() print('str: %s'%str) 运行结果: hello world str: None return None def func(): s ="hello world" print(s) return None str = func() print('str: %s'%str) 运行结果: hello world str: None 返回一个值 def func(): s ="hello world" print(s) return s str = func() print('str: %s'%str) 运行结果: hello world str: hello world 返回多个值 def func(): s ="hello world" s1 = 'hi' print(s) return 1,2 str = func() print(str) 运行结果: hello world (1, 2) def func(): s ="hello world" s1 = 'hi' print(s) return 1,2 str1,str2 = func() print(str1,str2) 运行结果: hello world 1 2View Code

?

?四、函数的参数1.位置参数函数调用时根据函数定义的参数位(形参)置来传递参数 示例:#-*- coding:utf-8 -*-2 def msg(name,age): print("Hello,your name is %s,your age is %s"%(name,age)) msg('root',12)View Code 位置参数必须一一对应,缺一不可2.关键字参数在函数调用时,通过‘键--值’方式为函数形参传值,不用按照位置为函数形参传值。 注意:

关键字参数必须在位置参数右边

对同一个形参不能重复传值

# #-*- coding:utf-8 -*- # # 按照顺序为函数形参传值 # def msg(name,age,sex): # print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex)) # msg('root',12,'男') #有位置参数和关键字参数时,关键字参数要放在位置参数后面 # def msg(name,age,sex): # print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex)) # msg('root',12,sex= '男') # 参数中有多个关键字参数时,关键字参数不分先后顺序 # def msg(name,age,sex): # print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex)) # msg('root',sex= '男',age= 22)正确示例

?

# 关键字参数放在了位置参数的前面 # def msg(name,age,sex): # print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex)) # msg(name='root',22,'男') # def msg(name,age,sex): # print("Hello,your name is %s,age is %s,sex is %s"%(name,age,sex)) # msg('root',age=12,'男')错误示例

?

3.默认参数在定义函数时,可以为形参提供默认值。对于有默认值的形参,调用函数时如果为该参数传值,则使用传入的值,否则使用默认值。 注意:

在调用函数时可以不给有默认值的形参传值

无论是函数的定义还是调用,默认参数的定义应该在位置形参右面

只在定义时赋值一次

默认参数通常应该定义成不可变类型

示例:def msg(name,age,sex='男'): #默认参数在关键字参数后面  ...

?

def test(x,y=2): print(x) print(y) test(2) #只给一个参数传值,则另外一个使用默认值View Code4.非固定参数当函数定义时不确定要传入多少个实参时,就可以使用非固定参数。而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs

?

4.1*args? 接收的是实参,位置参数,将转化成元祖返回def test(*args): print(args) test(1,2,3,4,5) 运行结果: (1, 2, 3, 4, 5)View Codedef test1(x,*args): print(x) print(args) test1(1,2,3,4,5) 运行结果: (2, 3, 4, 5)View Code

?

?

?

4.2*kwargs 接收的是实参,关键字参数,将转化成字典返回def func(a,b,**kwargs): print(a,b,kwargs) func(a = 10,b = 20,cc = 30,dd = 40) 运行结果: 10 20 {'cc': 30, 'dd': 40}View Code ?参数定义顺序:位置参数->*args->默认参数->**kwargs

?

五、全局变量与局部变量

在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。

当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用。

global关键字:在函数内部修改全局变量

六、变量的作用域一个程序的所有变量并不是在哪个位置都可以访问的。访问权限决定于这个变量实在哪里赋值的。 命名空间: 局部命名空间 全局命名空间 内置命名空间

?

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:#!/usr/bin/python #-*- coding:UTF-8 -*- total = 0 # 这是一个全局变量 def sum(arg1,arg2): '''返回2个参数的和''' total1 = arg1 arg2 #total在这里局部变量 print('函数内是局部变量:',total) return(total) #调用sum函数 sum(10,20); print('函数外是全局变量:’,total) #输入结果 函数内是局部变量:30 函数外是全局变量:0View Code 变量查找顺序:先查找全局作用域,然后内置作用域 global关键字:可以是在函数内部声明的变量变成全局变量 nonlocal关键字:可以让内部函数中的变量在上一层函数中生效,外部必须要有这个变量 ?# -*- coding: UTF-8 -*- globvar = 0 def set_globvar_to_one(): global globvar # 使用 global 声明全局变量 globvar = 1 def print_globvar(): print(globvar) # 没有使用 global set_globvar_to_one() print globvar # 输出 1 print_globvar() # 输出 1,函数内的 globvar 已经是全局变量View Code七、匿名函数python使用lambda来创建匿名函数。 1.lambda只是一个表达式,函数体比def简单很多。 2.lambda的主题式一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。 3.lambda函数拥有自己的命名空间,且不能访问只有参数列表之外或全局命名空间里的参数 4.虽然lambda函数看起来只能写一行,却不等同于C或C 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率 语法:lambda函数的语法只能包含一个语句,如下:lambda[arg1[,arg2,......argn]]:expression 如下实例: #!/usr/bin/python #-*- coding:UTF-8 -*- sum = lambda arg1,arg2:arg1 arg2; print('相加后的值为:‘,sum(10,20) print('相加后的值为:‘,sum(20,20) 以上实例输出结果: 相加后的值为:30 相加后的值为:40View Code八、闭包

定义:

  python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包

def func1(): x = 12 def func2(): print(x) return func2 f = func1() print(type(f)) print(f) f() 执行结果: 12View Code 结合这段简单的代码和定义来说明闭包: 如果在一个内部函数里:f2()就是这个内部函数, 对在外部作用域(但不是在全局作用域)的变量进行引用:x就是被引用的变量,x在外部作用域f1()里面,但不在全局作用域里。 则这个内部函数f2()就是一个闭包。   从函数的定义角度出发:函数可以嵌套使用,可以把函数当成参数或返回值进行传递,函数也可以作为容器类型的元素,作为一个变量可以去赋值。   在这个简单的例子当中,函数f1()中嵌套定义另一个函数f2(),内部的函数f2()引用了外部函数f1()的变量,函数f2()被当成夹带外部变量的?对象?返回给f1(),这样就形成一个闭包函数。   实例化输出的时候 定义的 f=f1()中, 其实 f 就是函数f2()(不准确但是好理解)。这里需要注意的是,f 是一个函数名,加上()就能当作函数来用了。(因为f2()返回的是一串函数执行过程的包)闭包的用途闭包就是为了不动原函数里面的代码,还要给它增加‘新功能’的一种手段。九、装饰器装饰器是闭包的一种应用场景,符合开放封闭原则 *对扩展是开放的 *对修改是封闭的 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离。    解耦目的,提高代码的重用性 代码示例:#_*_coding:utf-8_*_ def login(func): def inner(): _username = 'alex' _password ='123' username = input("user:") password = input("password:") if username == _username and password ==_password: print("Login Sucess") else: print("Error") return inner @login # home = login(home) def home(): print("---Home Page----") def pic(): print("-----Picture-----") #home = login(home) home()无参装饰器

?

user_status = False def login(auth_type): def outer(func): def inner(*args,**kwargs ): _name= 'alex' _passwd = '123' global user_status if user_status == False: name = input('姓名:') password = input('密码:') if name == _name and password == _passwd: print("welcome") user_status = True else: print('error') if user_status == True: func(*args,**kwargs) return inner return outer @login('qq') def home(abc): print("====首页=====") # @login def vidio(): print("电影") def book(): print("书籍") home1 = login('qq') home = home1(home) home('qa')有参装饰器

?

? 来源:


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有