9. Python 学习过程的第一个山坡,99%的人都倒在了山坡下

梦想橡皮擦 等级 786 0 0

Python 学习的第一个难关 -- 函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪瞪,不用慌,学编程就是这样,先学过去,在从上帝视角去看,坚持打卡,我一天写一篇,你可以两天学一篇。

9. Python 学习过程的第一个山坡,99%的人都倒在了山坡下

想学 Python 爬虫,可以订阅橡皮擦专栏哦~ 💋💋💋 点击发现惊喜 💋💋💋

九、Python 中函数是基础部分第一道难关

9.1 函数出现的背景

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

  1. 在开发的时候,很多项目都是团队开发,把代码功能编写成一个个的函数,方便维护,每个人也可相对独立的开发,缩短整体开发时间
  2. 代码编写成函数以后,重复的功能只写一次即可,其它地方可以直接调用,方便了代码的复用。

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

9.2 函数初接触

咱从本系列博客一开始就已经接触函数的概念了,例如第一篇就学习的 print, 就是一个内置函数,相似的还有 lenaddsorted 这些,调用函数时最大的便捷性就是不用知道函数内部的具体实现,就可以用该函数使用自己想要的效果。

9.2.1 函数的定义

具体的语法格式如下:

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

if 语句,for 语句一样,函数定义与使用的时候要注意下代码缩进。

函数名称必须是唯一的,进行声明的有意义,不要使用 a 当做函数名,以后很有可能就忘记了这个函数是做什么用的。

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

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

注意第一行末尾的分号

9.2.2 无参数无返回值的函数

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

# 创建一个函数
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 个位置,而使用函数只需要修改函数中的代码块一处即可。

9.3 函数的参数设计

上文中设计的是一个无参数的函数,但在实际应用中很少出现一个无参函数,更多的时候是需要给函数传递参数的。

9.3.1 传递一个参数

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

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

show("橡皮擦")
show("大橡皮擦")
show("小橡皮擦")

小括号里面的 name 即为参数,该参数能在函数内部代码块直接使用。

9.3.2 传递多个参数

多个参数只需要在函数声明时小括号里面多增加几个参数即可。

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

show("橡皮擦", 20)
show("大橡皮擦", 21)
show("小橡皮擦", 18)

多个参数一定要注意参数的位置,前后顺序如果错误,会导致严重 BUG。上述代码中 橡皮擦 会传递给 name20 会传递给 age

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

该参数使用的方式是在调用函数时,参数用 参数名称=值 这种形式传递。其实在上述传递一个和多个参数的时候,也可以应用该方式传递参数,例如修改代码如下。

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

show(name="橡皮擦")


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

show1(name="橡皮擦", age=20)

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

9.3.4 参数默认值

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

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

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

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

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

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

def show(a,b,c,name="橡皮擦"):
    pass

9.4 函数返回值

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

9.4.1 返回 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)

9.4.2 返回一个值

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

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

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

9.4.3 返回多个值

使用 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)

9.4.4 返回字典与列表

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

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

def sub2():
    return {"name": "橡皮擦", "loc": "CSDN"}

9.5 调用函数时参数是列表

为什么单独将其参数是列表时拿出来讲解,是因为列表这个有点特殊,里面还会引出全局变量与局部变量的一个概念,放心第一遍学习 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 并不是一视同仁的,列表变量在函数内被修改影响到了外部变量,而整型变量并没有受到影响。

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

9.6 局部变量与全局变量

这个概念非常难理解,是的,如果你理解了在这个阶段也是一知半解。

在设计函数的时候,有时需要控制变量的使用范围,如果变量的使用范围在函数内部,那这个变量叫做局部变量,注意是函数内部。如果某个变量的使用范围在整个程序,这个变量就是全局变量。

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

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

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。

有了上面的这些基础知识点,你应该注意下变量的使用范围这个概念了,在面向对象的时候还将继续学习。

9.7 传递任意数量的参数

9.7.1 一般参数与任意参数的组合

在 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) ,这样就报错了。

9.7.2 一般参数与任意数量的关键词参数

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

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 了。

9.8 函数以后的扩展

函数本文只是介绍了 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)

9.9 这篇博客的总结

函数,初学阶段,这是啥,为什么,不懂唉;学习中期,写函数好舒服啊,面向对象那里有函数好用;学习后期,快点实现这个功能,啥方法都行,抓紧点,马上下班了。

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

最后一碗毒鸡汤

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

🍂🍂🍂🍂🍂🍂🍂


9. Python 学习过程的第一个山坡,99%的人都倒在了山坡下

收藏
评论区

相关推荐

9. Python 学习过程的第一个山坡,99%的人都倒在了山坡下
Python 学习的第一个难关 函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪瞪,不用慌,学编程就是这样,先学过去,在从上帝视角去看,坚持打卡,我一天写一篇,你可以两天学一篇。 9. Python 学习过程的第一个山坡,99%的人都倒在了山坡下(https://imghelloworld.osscnbeijing.aliyun
如何用python进行数据分析——00环境配置
↑一个宝藏公众号,长的好看的人都关注了  简单介绍一下Python吧 Python是一种面向对象程序设计语言,由荷兰人吉多·范罗苏姆于1989年底发明。目前是最常用也是最热门的一门编程语言之一,应用非常广泛。 (不是这个面对对象) 为什么选择python呢? 有人说python是万能的,除了生孩子不会,什么都会。 有人说python是未来
python文件的第一行 #!/usr/bin/python3 是什么意思?
python文件的第一行代码通常在脚本语言的第一行会看到: !/usr/bin/env python或 !/usr/bin/python 首先要确定的一点是它不是注释。这两句话的目的都是指出你的python文件用什么可执行程序去运行它。1. !/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释
20180607pip install xxx报错SyntaxError invalid syntax
用pip安装时都要在cmd命令行里启动的,而在python中无法运行。退出python运行环境就再执行pip可以了。而且最好用管理员身份运行cmdC:\WINDOWS\system32>cd D:\Python\APIC:\WINDOWS\system32>D:D:\Python\API>pip install wordcloud-1.4.1-cp3
20180607pip install xxx报错SyntaxError invalid syntax
用pip安装时都要在cmd命令行里启动的,而在python中无法运行。退出python运行环境就再执行pip可以了。而且最好用管理员身份运行cmdC:\WINDOWS\system32>cd D:\Python\APIC:\WINDOWS\system32>D:D:\Python\API>pip install wordcloud-1.4.1-cp3
CentOS升级Python到2.7版本
查看python的版本 python -V Python 2.4.3 1.先安装GCC yum -y install gcc 2.下载Python-2.7.2 wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2 3.解压Python-2.7.2
Python 3 教程
Python 3 教程 =========== ![python3](https://www.runoob.com/wp-content/uploads/2014/05/python3.png) Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,
Python import与from import使用及区别介绍
Python程序可以调用一组基本的函数(即内建函数),比如print()、input()和len()等函数。接下来通过本文给大家介绍Python import与from import使用及区别介绍,感兴趣的朋友一起看看吧 下面介绍下Python import与from import使用,具体内容如下所示: Python程序可以调用一组基本的函数(即内建函
Python 修改pip源
接触python多半年光景了,多数时间都是在公司看看书,最近终于有空在家学学python,写点代码。 可是涉及到python,就要说到python的模块了,python不管从代码风格还是涉及面上,都辣么辣么的惊艳。 好吧,谈及下载python第三方模块,势必谈及pip,默认的pip源下载速度实在是不给力啊不给力。所以修改pip源吧。 特别注意了
Python 和 JS 有什么相似?
Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数、解构赋值、Decorator等),同时本文会对 Python 的一些用法与 JS 进行类比。不管是提升自己的知识广度,还是更好地迎接 AI 时代,Python 都是一门值
Python升级Linux
CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对旧版本进行升级。 由于很多基本的命令、软件包都依赖旧版本,比如:yum。所以,在更新 python 时,建议不要删除旧版本(新旧版本可以共存)。 查看 Python 版本号 ============= 当 Linux 上安装 Python 后(默认安装)
Python基础:四、python的优缺点
python是一门动态解释性的强类型语言 -------------------- ### python的优点: **1\. python的定位是"优雅"、"明确"、"简单"**         python程序看上去总是简单易懂,初学者学python,不但入门容易,二缺将来深入下去,可以边啊些那些非常复杂的程序。 **2\. 开发效率高**  
Python源码在Win下和Linux下的编译,C++调用Python库绘制等高线
### 目录 前言 Python源码以及VS2017的准备 Python源码 VS2017 Windows下编译Python源码 编译命令 编译步骤 编译后的配置 添加注册表 Win10中编译Python源码小结 Windows中C++调用Python代码绘制等高线图 CMakeLists.txt文件如下: Python代码如下: CPP文件:
Python环境搭建—安利Python小白的Python和Pycharm安装详细教程
人生苦短,我用Python。众所周知,Python目前越来越火,学习Python的小伙伴也越来越多。最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了方便大家学习Python,小编整理了一套Python和Pycharm安装详细教程,只要大家按照这个步骤来,就可以轻松的搞定Python和Pycharm的安装了。
Scrapy框架
\[TOC\] 1\. Scrapy介绍 ============ 1.1. Scrapy框架 ------------- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 ![](http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/