函数
列表推导式(List Comprehension)
可以更优雅地创建一个列表,通常是通过一个序列(Sequence)进行构建一个列表
函数(Function)
实现某个功能的代码块,即将若干行代码封装在一起成为一个独立的整体,便于代码复用,体现模块化编程的思想
分为两种:
-
内置函数(Built-in Function):Python解释器提供的,直接可以使用,例如print,input,type等
-
自定义函数(Self Defined Function):自己定义的函数,使用def关键字定义一个函数
函数名命名规则和变量名一样
调用函数时程序执行流程会发生跳转,即进入到函数内部执行里面的语句,当函数内部的所有语句执行完了,或者执行了return语句,函数就执行结束返回了,继续往下执行调用处之后的语句
在一个函数中,如果没有return语句或者return关键字后面没有除了None之外的值,那么函数的返回值都是None
函数可以return多个值,本质其实是返回一个tuple
函数参数(Function Argument)的不同情况:
-
未知参数(Positional Argument),按照参数定义的位置传递,并且是必须的
-
默认参数(Default Argument),参数带有默认值,如果调用时没有传参,则参数使用默认值,默认参数必须写在所有非默认参数的右边,为了让函数调用起来更轻松简单,建议将变化大的默认参数写在变化小的左边,默认参数方便以后调用,减少代码的重复量
-
可变参数(Variable Argument):参数个数不固定,其实可变参数就是一个tuple
-
-
命名关键字参数(Named Keyword Argument),和关键字参数一样,只是限定了函数能接受的关键字参数中的key的名字
虽然函数的参数有多种形式,但我们在实际应用中不要在一个函数中同时使用多种形式,建议不要超过两种,否则会让代码可读性大大降低,函数也很难调用
-
扩展
1.默认参数要靠右写,不要和非默认参数混合写,默认参数变化小的写在最右边
2.代码风骚后学习软件工程
map(func, seq1[, seq2,…]) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
Python函数编程中的map()函数是将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
函数详解
'''
认识函数:在一个完整的项目中,某些功能会反复的使用。
那么会将功能封装成函数,当我们要使用功能的时候直接调用函数即可
本质:函数就是对功能的封装
优点:
1.简化代码结构,增加了代码的复用度(重复使用的程度)
2.如果想修改某些功能或者调试某个BUG,只需要修改对应的函数即可
定义函数:
格式:
def 函数名(参数列表):
语句
return 表达式
def: 函数代码块以def关键字开始
函数名:遵循标识符规则
参数列表:(参数1,参数2,参数3,....)任何传入函数的参数
和变量必须放在园括号之间,用逗号分隔。函数从函数的调用者
那里获取的信息
():是参数列表的开始和结束
冒号:函数的内容(封装的功能)以冒号开始,并且缩进
语句:函数封装的功能
return:一般用于结束函数,并返回信息给函数的调用者
表达式:即为要返回给函数的调用者的信息
注意:最后的return表达式可以不写,相当于return None
#######
函数的调用
格式:函数名(参数列表)
函数名:是要使用的功能的函数名字
参数列表:函数的调用者给函数传递的信息,如果没有参数,小括号
也不能省略
本质:实参给形参赋值的过程
'''
#定义了一个无参无返回值的函数
def myPrint():
print("sunck is a very good man!")
print("sunck is a nice man!")
print("sunck is a handsome man!")
myPrint()
myPrint()
######函数的参数####
#需求 :编写一个函数,给函数一个字符串和一个年龄,在函数
#内部打印出来
#形参(形式参数):定义函数时小括号中的变量,本质是变量
#参数必须按顺序传递,个数目前要对应
#def myPrint(str,age,hoby):
# print(str,age)
def myPrint(str,age,):
print(str,age)
#实参(实际参数):调用函数时给函数传递的数据,本质是值
myPrint("sunck is a good man",18)
####函数的返回值####
#编写函数,实现功能,给函数两个数,返回这两个数的和
def mySum(num1,num2):
#将结果返回给函数的调用者
return num1+num2
#执行完return语句,改函数就结束了,return后面的代码不执行
print("*****8")
res = mySum(1,2)
print(res)
#####传递参数####
#值传递:传递的不可变类型
#string、tuple、number是不可变的
def func1(num):
num=10
temp=20
func1(temp)
print(temp)
#引用传递:传递的可变类型
#list、dict、set是可变的
def func2(lis):
lis[0]=100
li=[1,2,3,4,5]
func2(li)
print(li)
###关键字参数####
'''
概念:允许函数调用时参数的顺序与定义时不一致
'''
def myPrint(str,age,):
print(str,age)
#使用关键字参数
myPrint(age=18,str="sunck is a good man")
####默认参数###
'''
概念:调用函数时,如果没有传递参数,则使用默认参数
要用默认参数,最好将默认参数放到最后
def myPrint(str,age=18,):
print(str,age)
myPrint("sunck is a good man")
'''
def myPrint(str="sunck is a good man",age=18,):
print(str,age)
myPrint(age=17,str="sunck is a good man")
####不定长参数###
'''
概念:能处理比定义时更多的参数
'''
#加了星号(*)的变量存放所有未命名的变量参数,如果
#在函数调用时没有指定参数,它就是一个空元祖
def func(name,*arr):
print(name)
for x in arr:
print(x)
func("sunck","good","nice")
#**代表键值对的参数字典,和*所代表的意义类似
def func2(**kwargs):
print(kwargs)
func2(x=1,y=2,z=3)
#利用函数求多个数的和
def mySum(*l):
sum=0
for i in l:
sum+=i
return sum
print(mySum(1,2,3,4,5))
#可传递任意参数
def func3(*args,**kwargs):
pass
#########匿名函数######
'''
概念:不使用def这样的语句定义函数,使用lambda来创建
匿名函数
特点:
1.lambda只是一个表达式,函数体比def简单
2.lambda的主体是一个表达式,而不是代码块,仅仅只能在lambda
表达式中封装简单的逻辑
3.lambda函数函数有自己的命名空间,且不能访问自由参数列表之外的
或全局命名空间里的参数
4.虽然lambda是一个表达式且看起来只能写一行,与c与c++内联函数
不同
格式:lambda 参数1,参数2,......参数n:expression
'''
sum =lambda num1,num2:num1+num2
print(sum(1,2))