python初学者进阶必备知识点

文章目录

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函数

总结

文章中出现错误或者需要补充的内容欢迎在下方留言,后续还会有更多知识送给大家的

上一篇:回忆当年阿里的一道 SQL 面试题,亿级表合并


下一篇:Mybatis实践(一)类型转换器