文章目录
1,缺省函数参数
1,调用函数时,缺省参数的值如果没有传入,则被认为是默认值
2,具有默认值的参数必须在结尾
def default ( name,age = 35 ):
print ("Name: ", name)
print ("Age: ", age)
#调用 default 函数
default (name="name")
default (age=10,name="name" )
下面看一下操作结果:
Name: name
Age: 35
Name: name
Age: 10
在程序设计中,一个函数的缺省参数是指不必须指定值的参数。在大多数程序设计语言中,函数可以接受一个或多个参数。通常对于每个参数都需要指定它们的值。一些较新的程序设计语言允许程序员设定缺省参数并指定默认值,当调用该函数并未指定值时,该缺省参数将为缺省值。—*
2,*args和**kwargs的用法
*args和**kwargs主要用于函数定义,你可以将不定数量的参数传递给一个函数
*args主要是用来发送一个非键对值的可变数量的参数列表
def text_args(a_arg,*args):
print('first normal a_arg:',a_arg)
for arg in args:
print('another arg through *args:',arg)
text_args('name','pthon','java','c')
结果如下
first normal arg: name
another arg through *args: pthon
another arg through *args: java
another arg through *args: c
接下来看看kwargs
kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。适用在有键对值参数函数的时候
def kwargs(**kwargs):
for key, value in kwargs.itmes():
print('{}--{}'.format(key,value))
kwargs(name = 'xiaobai',age = 18)
结果:
name--xiaobai
age--18
接下来看看位置参数混入kwargs的时候
def get_kwargs(kw,**kwargs):
print('first normal kwarg',kw)
for key, value in kwargs.itmes():
print('{}-{}'.format(key,value))
get_kwargs('name',name = 'xiaobai')
结果如下
AttributeError: 'dict' object has no attribute 'itmes'
出现了一个属性错误
如果你想在函数中使用者三种参数,顺序是这样的:
def func (fargs,*args,**kwargs):
print('first normal fargs:',fargs)
print('first normal args:',agrs)
print('first normal kwargs:',kwargs)
func('fargs','args','kwargs','python',name = '小白')
结果
first normal fargs: fargs
first normal args: ('args', 'kwargs', 'python')
first normal kwargs: {'name': '小白'}
3,引用
先谈引用前,先了解一下变量,赋值
a = 1
print(a)
#1
在看一段代码
def number(a):
a[1] = a
print(a)
numbers([1,2,3])
我预想应当是
[1,[1,2,3],3]
实际上是
[1, [...], 3]
结果却为何要赋值无限次?
numbers[1] = numbers
#这样相当于创建了一个引用自身的结构,所以导致了无限循环,学过递归的看官,也应该了解过一些。
当初我也懵了好久,这样可以说 Python 没有赋值,只有引用。也可以说是用赋值这词不是很合适,换成引用比较合适一点,
总结:Python 中没有「变量」,我们平时所说的变量其实只是「标签」,是引用而已。
4, 递归
什么是递归? 递归见递归
递归在程序语言中简单的理解是:方法自己调用自己,初学者可能不太理解(也包括我自己吧(▽)),还是上代码吧
最经典的递归例子之一是斐波那契数列
def fib(n):
"""
This is Fibonacci by Recursion.
"""
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-1) + fib(n-2)
f = fib(10)
print(f)
#输出 55
换成 **f = fib(5)**在看看
f = fib(5)
#输出5
fib(n-1) + fib(n-2)就是调用了自己他本身,实现递归,下面走一个过程,方便理解一下。
1,一开始n = 5,走else分支,return fib(5-1)+(510-2)。
2,在看return fib(5-1)+(5-2)中的fib(5-1),也就是4,也要走else分支,在计算return fib(4-1)+(4-2),重复复循环。
3,当循环到**fib(2-1)+fib(2-2)**的时候,fib(2-1)返回,开始走elif分支,及返回1,同理fib(2-2),返回0,讲这两个的值返回到最开的那一步fib(5-1),fib(4-1)+fib(4-2)= 1+0+1+1+0=3,同理 fib(5-2),得2
4,结果就是fib(5-1)+fib(5-2)=3+2=5。
需要注意的是:
1,递归就是在过程或函数里调用自身。
2,必须有一个明确的递归结束条件,称为递归出口。
参考:斐波那契数列。
5,lambda函数
lambda函数也称为匿名函数,是几个比较突出的函数之一,关于剩下几个特殊函数还是以后再说了,其突出特点为能进行函数式编程
函数式编程(英语:functional programming)或称函数程序设计、泛函编程,是一种编程范式,它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算(lambda calculus)为该语言最重要的基础。而且,λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
-------------*
lambda准确的是应该是一个表达式,而不是函数
直接上代码:
lam = lambda x:x+3
list = []
for i in range(0,10):
list.append(lam(i))
print(list)
结果如下:
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
没让你们失望吧
上更复杂一点的吧
lam = lambda x, y, z : (x + y) ** z
lam(8,9,2)
输出为
289
是不是好理解多了
总结:
1,’:'前面是变量,后面是表达式,
2,lambda表达式只是让代码更加简洁,不会造成性能的提升
3,lambda函数不能包含命令,包含的表达式不能多于1个
4,不要太过于依赖lambda函数
总结
文章中出现错误或者需要补充的内容欢迎在下方留言,后续还会有更多知识送给大家的