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时,默认返回值为Nonedef func(): #函数定义 s ="hello world" print(s)str = func() #函数调用print('str: %s'%str) #因为没有返回值,此时的str_len为None运行结果:hello worldstr: Nonereturn不加参数时,返回Nonedef func(): s ="hello world" print(s) returnstr = func()print('str: %s'%str)运行结果:hello worldstr: Nonereturn Nonedef func(): s ="hello world" print(s) return Nonestr = func()print('str: %s'%str)运行结果:hello worldstr: None返回一个值def func(): s ="hello world" print(s) return sstr = func() print('str: %s'%str)运行结果:hello worldstr: hello world返回多个值def func(): s ="hello world" s1 = 'hi' print(s) return 1,2str = func()print(str)运行结果:hello world(1, 2)def func(): s ="hello world" s1 = 'hi' print(s) return 1,2str1,str2 = func()print(str1,str2)运行结果:hello world1 2View Code
?
#-*- coding:utf-8 -*-2def msg(name,age): print("Hello,your name is %s,your age is %s"%(name,age))msg('root',12)View Code位置参数必须一一对应,缺一不可
关键字参数必须在位置参数右边
对同一个形参不能重复传值
# #-*- 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,'男')错误示例
?
在调用函数时可以不给有默认值的形参传值
无论是函数的定义还是调用,默认参数的定义应该在位置形参右面
只在定义时赋值一次
默认参数通常应该定义成不可变类型
def msg(name,age,sex='男'): #默认参数在关键字参数后面 ...
?
def test(x,y=2): print(x) print(y)test(2) #只给一个参数传值,则另外一个使用默认值View Code
?
4.1*args? 接收的是实参,位置参数,将转化成元祖返回def test(*args): print(args)test(1,2,3,4,5)运行结果:(1, 2, 3, 4, 5)View Code
def 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 = 0def set_globvar_to_one(): global globvar # 使用 global 声明全局变量 globvar = 1def print_globvar(): print(globvar) # 没有使用 globalset_globvar_to_one()print globvar # 输出 1print_globvar() # 输出 1,函数内的 globvar 已经是全局变量View Code
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 func2f = func1()print(type(f))print(f)f()执行结果:<class 'function'><function func1.<locals>.func2 at 0x000002016685B9D8>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 = Falsedef 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("====首页=====")# @logindef vidio(): print("电影")def book(): print("书籍")home1 = login('qq')home = home1(home)home('qa')有参装饰器
?
?来源:http://www.icode9.com/content-1-147551.html联系客服