关于python:Python-学习过程的第一个山坡99的人都倒在了山坡下附源码

5次阅读

共计 5489 个字符,预计需要花费 14 分钟才能阅读完成。

Python 学习的第一个难关 — 函数,这个中央学会的人感觉没有啥,没学过的学的时候迷迷瞪瞪,不必慌,学编程就是这样,先学过来,在从上帝视角去看,保持打卡,我一天写一篇,你能够两天学一篇。

Python 中函数是根底局部第一道难关

函数呈现的背景

为什么在编程语言中会呈现函数概念,目标有 2 个。

  1. 在开发的时候,很多我的项目都是团队开发,把代码性能编写成一个个的函数,不便保护,每个人也可绝对独立的开发,缩短整体开发工夫
  2. 代码编写成函数当前,反复的性能只写一次即可,其它中央能够间接调用,不便了代码的复用。

间接写出这两个目标还是没有直观的感触,要在代码中感触函数的用法。

函数初接触

咱从本系列博客一开始就曾经接触函数的概念了,例如第一篇就学习的 print,就是一个内置函数,类似的还有 lenaddsorted 这些,调用函数时最大的便捷性就是不必晓得函数外部的具体实现,就能够用该函数应用本人想要的成果。

函数的定义

具体的语法格局如下:

def 函数名称(参数 1[, 参数 2, 参数 3...]):
    代码块
    代码块
    return 返回值

if 语句,for 语句一样,函数定义与应用的时候要留神下代码缩进。

函数名称必须是惟一的,进行申明的有意义,不要应用 a 当做函数名,当前很有可能就遗记了这个函数是做什么用的。

参数值,非必须,依据函数的要求自行设定即可,各个参数值之间用 , 分隔。

返回值,非必须,返回多个值应用逗号 , 分隔即可。

留神第一行开端的分号

无参数无返回值的函数

该内容将演示函数的应用便捷性。

# 创立一个函数
def show():
    print("我是一个无参数无返回值的函数")
    print("hello world")

show()
show()
show()
show()
show()

函数申明之后,通过 函数名() 进行调用,下面的代码写了 5 次 show(),示意函数被调用了 5 次。

如果不通过函数实现上文成果,须要将函数外部的代码复制 5 次。

print("我是一个无参数无返回值的函数")
print("hello world")
print("我是一个无参数无返回值的函数")
print("hello world")
print("我是一个无参数无返回值的函数")
print("hello world")
print("我是一个无参数无返回值的函数")
print("hello world")
print("我是一个无参数无返回值的函数")
print("hello world")

单纯的复制代码还好,如果我当初心愿将 hello 批改成 hi,那不应用函数须要批改代码的 5 个地位,而应用函数只须要批改函数中的代码块一处即可。

函数的参数设计

上文中设计的是一个无参数的函数,但在理论利用中很少呈现一个无参函数,更多的时候是须要给函数传递参数的。

传递一个参数

函数内有参数,代码如下:

# 申明一个带一个参数的函数
def show(name):
    print("传递进来的姓名是:", name)

show("查理")
show("大查理")
show("小查理")

小括号外面的 name 即为参数,该参数能在函数外部代码块间接应用。

传递多个参数

多个参数只须要在函数申明时小括号外面多减少几个参数即可。

# 申明一个带多参数的函数
def show(name, age):
    print("传递进来的姓名是:", name, "年龄是:", age)

show("查理", 20)
show("大查理", 21)
show("小查理", 18)

多个参数肯定要留神参数的地位,前后程序如果谬误,会导致重大 BUG。上述代码中 查理 会传递给 name20 会传递给 age

关键词参数(参数名称 = 值)

该参数应用的形式是在调用函数时,参数用 参数名称 = 值 这种模式传递。其实在上述传递一个和多个参数的时候,也能够利用该形式传递参数,例如批改代码如下。

# 申明一个带一个参数的函数
def show(name):
    print("传递进来的姓名是:", name)

show(name="查理")

# 申明一个带多参数的函数
def show1(name, age):
    print("传递进来的姓名是:", name, "年龄是:", age)

show1(name="查理", age=20)

用这种模式调用函数,参数的地位就不在重要了,因为曾经指定参数具体值是多少。

参数默认值

在定义函数的时候能够给参数一个默认值,如果调用该函数没有给该参数赋值,程序会应用默认值而不会报错。

# 没有默认值的参数
def show(name):
    print("传递进来的姓名是:", name)

show() # 该函数调用时会报错

# 有默认值的参数
def show(name="查理"):
    print("传递进来的姓名是:", name)

show() # 该函数调用没有问题,即便没有传递参数会应用默认值

如果一个参数有默认值,留神该参数必须放在函数参数地位的最右侧,例如下述函数定义。

def show(a,b,c,name="查理"):
    pass

函数返回值

函授的返回值属于非必选项,能够写能够不写,不写的时候也会有返回值,该值为 None。

返回 None

函数如果没有写返回值即 return,那 Python 会主动在函数体内减少一行代码 return None。函数的返回值能够赋值给一个变量,通过打印该变量,即可晓得返回的具体内容。

# 没有返回值的函数
def show():
    print("留神上面没有 return")

ret = show()
print(ret)

失去的 ret 的值是 None,示意没有返回值。

如果只写 return,也会返回 None,留神下述代码是正确的。

# 没有返回值的函数
def show():
    print("留神上面没有 return")
    return
ret = show()
print(ret)

返回一个值

函数常见的状况是有返回值的,例如执行一段计算代码之后返回计算结果。

# 定义一个减法函数
def sub(a, b):
    c = a - b
    return c

# 参数为 2 和 1,将后果进行返回
ret = sub(2, 1)
print(ret)

返回多个值

应用 return 返回函数数据,能够一次性返回多个值,返回的数据之间用逗号分隔即可。

# 定义一个减法函数
def sub(a, b):
    c = a - b
    d = a + b
    f = a / b
    return c, d, f

# 参数为 2 和 1,将后果进行返回
ret = sub(2, 1)
print(ret)

返回的后果是一个元组 (1, 3, 2.0)

返回字典与列表

函数能够返回字符串类型的变量,这个与返回一个值一样,只是具体数据类型的区别,除了上述提及的内容,函数也能够返回比较复杂的数据,例如字典或者列表,该内容没有特地阐明的,你只须要将字典和列表看成一般的数据类型进行返回即可,例如下述代码。

def sub1():
    return [1, 2, 3]

def sub2():
    return {"name": "查理", "loc": "CSDN"}

调用函数时参数是列表

为什么独自将其参数是列表时拿进去解说,是因为列表这个有点非凡,外面还会引出全局变量与局部变量的一个概念,释怀第一遍学习 100% 迷糊。如果你有其余编程语言的功底,那另当别论。

具体代码如下,留神看呈现的问题。

names = ["aaa","bbb","ccc"]

def change_list(one_names):
    # 批改传递进来的列表索引 0 的地位上为 jjj
    one_names[0] = "jjj"

# 函数调用,同时将 name 作为参数传递进函数外部
change_list(names)

print(names)

最终的输入后果是 ['jjj', 'bbb', 'ccc'],这个示意啥?示意函数里面的 names 被函数给批改了。疑难是所有在函数里面的变量传递到参数外部都会被批改吗?换个整数试试。

score = 1
def change_list(one_score):
    one_score = 333

# 函数调用,同时将 score 作为参数传递进函数外部
change_list(score)

print(score)

此时 score 尽管在函数外部被批改为了 333,然而在函数外打印并没有被批改,还是 1。当初问题就呈现了,Python 并不是厚此薄彼的,列表变量在函数内被批改影响到了内部变量,而整型变量并没有受到影响。

这个坑咱先挖下,当前缓缓填,为啥列表在函数内批改,函数里面也会受到影响,波及到内存地址空间这些更底层的概念了。先学习一下局部变量与全局变量。

局部变量与全局变量

这个概念十分难了解,是的,如果你了解了在这个阶段也是只知其一; 不知其二。

在设计函数的时候,有时须要控制变量的应用范畴,如果变量的应用范畴在函数外部,那这个变量叫做局部变量,留神是函数外部。如果某个变量的应用范畴在整个程序,这个变量就是全局变量。

上述内容只是首次接触,在函数局部咱先简略弄个概念在心里在说。

全局变量在所有函数都能用

score = 1

def change_list():
    # 输入全局变量 score,因为这个变量在函数里面申明的,大家都能够用
    print(score)

change_list()
# 在函数里面也能够应用
print(score)

下面的 score 并未在函数外部申明,然而函数外部也能够拜访到,那函数里面的变量 score 就是全局变量。

局部变量在函数内部和其它函数不能应用

def change_list():
    # 局部变量 score,本函数能够用
    score = 1
    print(score)

change_list()
# 局部变量 score,在函数里面不能够应用
print(score)

# 其它函数外部也不能够应用
def show():
    print(score)

如果局部变量和全局变量名称反复
在程序设计的时候很容易呈现重名的状况,这种状况比拟难堪了,初学难度持续减少。

score = 5555
def change_list():
    # 局部变量 score,本函数能够用
    score = 6666
    print(score)

change_list()
# 里面应用的全局变量 score
print(score)

执行之后发现在里面应用的是全局变量的值 5555,在函数外部应用的局部变量的值 6666。

有了下面的这些根底知识点,你应该留神下变量的应用范畴这个概念了,在面向对象的时候还将持续学习。

传递任意数量的参数

个别参数与任意参数的组合

在 Python 编写代码的过程中,很容易呈现一种状况是你不晓得有多少个参数,这时函数定义时参数就不好设定了,好在 Python 曾经想到了这个状况。

def show(*keys):
    print("传入的参数能够循环打印")
    for key in keys:
        print(key)

show(1,2,3,4,5,6,7)

在函数定义的时候,参数地位应用 * 参数名,而后在函数体重的代码块地位就能够进行循环打印了,能够捕捉到任意数量的参数。

如果又有个别参数,又有不定数量的参数怎么办?好办,应用上面的格局。

def show(name,age,*keys):
    print("传入的参数能够循环打印")
    print(name)
    print(age)
    for key in keys:
        print(key)

show("www",18,1,2,3)

心愿你当初发现法则,函数调用的时候先顺次去匹配函数定义的参数,一一对应,都对应结束,发现没有个别参数了,剩下的都打包给 *keys 就好了。

还要不要写两个带 * 的参数,例如 def show(name,*keys,*keys1),这样就报错了。

个别参数与任意数量的关键词参数

参数外面还有一种状况是须要传不定数量的关键词参数,这又如何设计呢?

def show(**args):
    print("传入的参数能够循环打印")

    for key in args.items():
        print(key)

show(name="查理", age=18)

这种状况,你把传递进去的所有参数当成一个字典即可,主动聚合成了一个字典类型的数据。

如果与个别参数进行匹配,规定也非常简单。

def show(name,**args):
    print("传入的参数能够循环打印")
    print(name)
    for key in args.items():
        print(key)

show(name="查理", age=18)

上述代码先去匹配关键词参数,匹配胜利了就赋值到对应关键词上,例如下面的 name 变量在函数调用时赋值了 橡皮擦,那它就等于橡皮擦,其余的例如 age 没有关键词参数对应,只好打包给 **args 了。

函数当前的扩大

函数本文只是介绍了 5 成左右的内容,在 Python 中函数还有很多乏味的知识点存在,然而不能一口吃饱,那样的后果就是消化不好,而且不合乎咱滚雪球学 Python 的设计初衷,就是要滚上几遍才能够彻底把握。

延期学习的知识点如下:

  • 递归函数
  • 匿名函数
  • 高阶函数

还有一个知识点你能够当初扩大,咱学习了各种参数的模式,你有没有想过将这些组合在一起呢,例如 def show(name,age,*arg,**args) 在程序中是怎么解析的呢?程序变动可不可以呢?

def show(name, age, sex="男", *arg, **args):
    print("传入的参数能够循环打印")
    print(name)
    for key in args.items():
        print(key)

show("查理", 18, "男", like=99)

这篇博客的总结

函数,初学阶段,这是啥,为什么,不懂唉;学习中期,写函数好难受啊,面向对象那里有函数好用;学习前期,快点实现这个性能,啥办法都行,放松点,马上下班了。

没错,函数就处在一个说难很难,转身又很简略的一个环节。

最初一碗毒鸡汤

编程须要一个顿悟的时刻,而这个时刻很多人就没有过。O(∩\_∩)O 哈哈~

正文完
 0