https://www.cnblogs.com/skywlj1106/p/10311634.html
博客园
一、函数的基本用法
1、概念:
函数是对程序逻辑进行结构化或是过程化的一种编程方法,其是组织好的,可重复使用的,用来实现单一,或者相同功能的代码段。
函数提高了应用点的模块性和代码的重复利用率
本质:函数是对功能的封装
形式参数:简称形参,本质是一个没有值的变量 实际参数:简称实参,本质是常量,变量或者表达式 传参:实参给形参赋值的过程
而实参的类型取决于形参的需要
2、函数定义:
def 函数名(参数1,参数2,参数3.。。。): 函数体 return 返回值
注:a、函数命名遵循标识符规则,做到见名知意,小驼峰命名法、
b、参数1,参数2,参数3.....形式参数,不同的参数之间使用逗号隔开,参数的数量没有限制,依据具体的需求决定参数的数量
c、函数体:被封装的功能
d、return:结束函数,将返回值返回给调用者,也可单独使用
e、返回值可为常量、变量、表达式
3、返回值
返回值:表示一个函数执行完毕之后得到的结果
注:对于return语句不带参数,则返回一个None
4、调用
函数的调用:实质就是函数入栈出栈的过程
即:函数的入栈:函数被调用;函数的出栈:函数被调用完毕
注:在函数调用的过程要注意避免出现死循环
5、变量的作用域
变量的作用域:指变量可以被访问的范围
作用域的划分:
L:(local)局部作用域
E:(Enclosing)函数作用域(闭包)
G:(Global)全局作用域
B:(Built-in)内置作用域
变量的查找规则(变量重名):
python中变量的作用域由大到小,依次为内建(built_in B) >全局(glbal G)> 函数的闭包外(enclosing E)> 局部(local L)
注:在变量重名情况下在函数内部访问变量时使用就近原则。
如果将全局变量的名字声明在一个函数体内的时候,全局变量的名字能被局部变量给覆盖掉,此时我们就需要使用global或者nonlocal来声明变量了。
#1.变量不重名 num1 = 10 #全局作用域 def outer(): num2 = 20 #函数作用域 def inner(): num3 = 30 #局部作用域 print(num1,num2,num3) return inner f = outer() f() # global:全局的 # 全局变量 num1 = 4 def func1(): # 声明num1是全局变量的num1 global num1 print(num1) #4 num1 = 20 func1() a = 10 def test(): global a a = a + 1 print(a) #UnboundLocalError: local variable 'a' referenced before assignment test() # nonlocal:不是局部的 # nonlocal;前提条件:必须使用在闭包中 x = 0 # 全局作用域 def outer(): x = 1 # 函数作用域 def inner(): # 将一个局部作用域的变量声明为不是局部的,局部----》函数 nonlocal x x = 2 #局部作用域 print("inner:",x) #在外部函数中调用内部函数 nner() print("outer:",x) outer() print("global:",x)
6、参数
1、参数的传递:
参数的传递有值传递和引用传递
值传递:传递不可变类型的数据,例:num、string、tuple等;在值传递时,形参的改变并不会影响实参
引用传递:传递可变类型的数据,例:list、dict、set等;形参的改变会影响实参的使用
在函数中参数传递的是对象的引用
#引用传递:传递列表或者字典时,如果改变引用的值,就修改了原始的对象
def check(l): print(l) print(id(l)) l.append([1, 23, 2, 3, 4]) return l l = [1, 2, 3, 4] print(check(l)) print(id(l)) ''' [1, 2, 3, 4] 2902500909320 [1, 2, 3, 4, [1, 23, 2, 3, 4]] 2902500909320 ''' #值传递:当传递不可变对象时,如果改变引用变量的值,只是创建了不同的对象,原始对象并没有改变。 def check(s): print(s) print(id(s)) s = "i am test" print(id(s)) return s s = "This is a test" print(check(s)) print(s) ''' This is a test 2418424029424 2418424029488 i am test This is a test
2、参数的类型:
a、必须参数:必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
def printme( str ): "打印任何传入的字符串" print str return #调用printme函数 printme()
b、关键字参数:允许实参的顺序和形参的顺序不一致,因为Python解释器会根据关键字参数的名称自动的匹配
def show2(name,age): print("name:%s age:%d" % (name,age)) show2(name="jack",age=47) # 注:关键字参数使用在实参列表中,不要求顺序保持一致 show2(age=36,name="fadj") # 注:在实参列表中,可以不全部设置为关键字参数 show2("zhangsan",age=15) # 注:关键字参数只能出现在实参列表的后面 def show3(a,b,c): print(a,b,c) show3(1,4,4) show3(a=3,c=5,b=5) show3(45,b=9,c=18) #show3(a=45,9,18) #SyntaxError: positional argument follows keyword argument
c、默认参数:调用函数的时候,如果没有传递参数,则使用默认值【default】
#注意1:默认参数体现在形参列表中 def func3(name="abc",age=18): print("name:%s age:%d" % (name, age)) #注意2:使用了默认参数,则可以选择不传参,使用的默认值,如果传参,则相当于给形参重新赋值 func3() func3("jack",19) #注意3:关键字参数和默认参数可以结合使用 func3(name="jack",age=19) func3("jack",age=19) #注意4:形参列表可以不全部设置为默认参数,只要吃部分设置,则默认参数出现在形参列表的后面 #报错:SyntaxError: non-default argument follows default argument # def show4(name="abc",age): # print("name:%s age:%d" % (name, age)) # show4("bob",18) print("hello")
d、不定长参数:可以处理比声明时更多的参数
#a.*,一般写法为*args def text1(*num): print(num) for n in num: print(n) # *不定长参数被当做元组处理,num形参名其实就是元组名 text1(10) text1(10,4,54,65,65,7) # 可以传一个元组,但是,元组被当做一个整体全部传参 text1((54,4,64)) # 一般情况下,将不定长参数设置在形参列表的最后 def text2(*num3,num1,num2): print(num1,num2,num3) # 如果不定长参数出现在形参列表的前面或者中间,则可以借助于关键字参数传参 #text2(12,43,43) text2(12,34,num1=35,num2=59) # 在形参列表,不定长参数最好只出现一个 #错误演示 # def text3(*num3,num2,*num1): # print(num1,num2,num3) # text3(43,53,num2=10,5,5,4) #b.**,一般写法为**kwargs def text4(**num3): print(num3) #注意1:**,被当做字典处理,传参的时候,需要以key=value的方式进行传参 text4(x=26,y=17) #注意2:在形参列表中使用**,保证出现在后面 """ 使用场景:单例设计模式 def text(*args,**kwargs):
总结:
a.必需参数使用最多,其次是不定长参数
b.关键字参数和默认参数最多使用在系统函数中
"""
7、匿名函数
lambda表达式:python中的匿名函数主要用来处理一些简单逻辑表达式的封装,使用lambda关键字
优点:不占用内存,提高代码的运行速度
一般格式为:
var = lambda args:表达式#例如:f = lambda x,y:x+y#该函数的调用结果为 冒号后的表达式所表达的结果print(f(1,2))
每周项目:
每周1项目|(04)javaWeb聊天室
每周1项目|(03)java成绩管理系统
每周1项目|(02)网上书店项目
每周1项目|(01)网上商城项目
框架:
着手的第一个框架项目|SSM之MyBatis入门(上)
什么是SSM?
Asp.net
小程序出多端框架啦!!!!!
教学视频:
java开发集合
PHP全套第一、二套视频和资料
python视频和资料+Python全套(内有爬虫)+ Python高级编程技巧
24课时教程+2大实战项目,拿下Bootstrap,冲刺月薪30k的前端工程师!赶紧来领吧!
基础整理:
python篇?
Python基础知识与常用数据类型(07)
Python基础知识与常用数据类型(06)
Python基础知识与常用数据类型(05)
Python基础知识与常用数据类型(04)
Python基础知识与常用数据类型(03)
Python基础知识与常用数据类型(02)
Python基础知识与常用数据类型(01)
java篇?
java基础知识点整理(5)
java基础知识点整理(4)
java基础知识点整理(3)
java基础知识点整理(2)
java基础知识点整理(1)
其他篇?
javaScript——网页特效
CSS选择器
原来大神们都是这么玩的——不一样的html
最常用的标签(2)——标记语言html
最常用的标签(1)——标记语言html
初识编程世界——标记语言html
未完待续.............................................................