Python学习之旅第二天:进阶知识探索
@浙大疏锦行第一项:首先继续对“Python基础速成”的内容进行学习
函数的返回值
在Python中,若没有"return",即没有明确地返回一个值,那么其默认返回None。
由此,Python中,有两种类型的函数:一为有返回值的函数,通过return语句显式地返回一个值;
二为无返回值的函数:也就是说函数只执行某些操作,但不返回任何值,结果无法打印出来。
函数的参数
函数的参数有三种。三种可共存,但定义时有一定的顺序:
必选参数(也就是说该参数若不选择,函数是无法开始操作的)
默认参数(输入时可直接输入数值,不需指定如arg2=3)
不定长参数
关于“面向对象”
可将函数视为一个“密封袋”,其中封装了一系列的代码(即发给计算机的步骤说明,只不过该说明是用计算机可以听懂的语言写出的)。也就是说我们将要命令计算机执行的流程指令全部封装在该函数内部。
“面向对象”就是将即将处理的事务看作一个个体,一个对象。那么对于一个对象来说,它必然有它的属性(特点),和方法(功能)。有了这种思维,也就是我们形成了一套模板,只用调整其中的参数就可以(个人以为可以类比英语作文模板,有了这个模板,我们就不用每次从0开始,只是调整该模版内的一些细节就可以了)。
Q:那么“函数”与“面向对象”的区别在哪?
自思自答:表面来看,两者似乎都是模板。但对于“函数”来说,因为其内部是一些代码,所以我们实际的操作是落实在这些代码上的;而对于“面向对象”来说,我们调整参数时针对的就是面向对象本身(x 理解有误。看完文档后,重新理解,“函数”关注执行动作,且一个函数只做一件事。而“面向对象”关注“谁来执行”)
现在看一下文档中是如何解释的
文档中用“切菜”和“菜刀”来形象类比“函数”与“面向对象”。也就是说,函数聚焦于对数据的操作,是不能修改的工具,并且专注于工具的一个功能;而“面向对象”可以对工具进行修改。
关于“类”与“类的实例化”
对象的模板为“类”,对象为“类的实例化”
Python常见库
何为“库”? “库”封装“类”和“函数”。也就是说“库”是更大的系统。比如:厨具+各种烹饪步骤。
为避免“库”中类名和函数名重合,调用时需加上库名。同时,在调用时为避免导入一些实际不需要的代码可以尽可能的只导入“库”的一部分。
标准导入
最基本最常见。直接使用“import”语句。 如:
import numpy #导入整个库
import pandas as pd #常见用别名简化后续函数调用
#使用时需要加上库的前缀
arr = np.array([1,2,3,4,5]) #使用np前缀创建一个numpy数组
df = pd.DataFrame(data) #使用pd前缀创建一个DataFrame
从库中导入特定项
如: from sklearn.model_selection import train_test_split
当使用from语法从库中导入特定函数或类时,这些函数或类前就不用再添加模块名了
即:这种写法sklearn.model_selection.train_test_split是错误的
导入全部内容
若要全部导入,可以用import math
from math import *(这将导入‘math’模块中定义的所有公开函数和变量)
我们有很多方法如:Numpy, Pandas, matplotlib, Seaborn, Sklearn, XGBoost, LightGBM(时下风靡)
文件导入
相对路径和绝对路径
绝对路径就是我们日常打开“本地电脑”查看文件时显示的路径。
它是从文件系统的根目录开始的完整文件路径。
路径前可加 r 来避免Python中因转义字符的存在而导致报错的现象
Q: 什么是“转义字符”?
[转义字符是一种特殊的字符,在编程里它的作用是表达一些无法直接书写或者有特殊用途的字符,如\n是表示换行的字符。再比如,双引号 "
在很多编程语言里是用来标记字符串的起始和结束的。要是你想在字符串里使用双引号,就不能直接写,得用转义字符 \"
。像 print("She said, \"Hello!\"")
,程序就会正确输出 She said, "Hello!"
。要是没有 \"
这个转义字符,程序就会把字符串里的双引号误认为是字符串的结束标志,从而导致代码出错。]
如:path = r' c:\Data\narcies.shp'
相对路径是在我们要移动文件时用的。以该文件的所在位置为起始点,以此,他人也可找到该文件。
./用来表示当前目录。
../表示父文件夹
同级的文件直接作为起始目录引用即可。
第二项:正式开始昨日未完成的Day1学习内容
了解变量和输出
题目: 定义三个变量 a, b, c,并分别将整数 1, 2, 3 赋值给它们。然后,使用 print() 函数将每个变量的值单独打印出来,每个值占一行。
● 输入: 无
● 输出:
1
2
3
进阶思考:
如何只用 一个 print() 函数调用就实现上面分三行的输出效果?(提示:换行符 \n)
格式化字符串
● 题目: 创建两个变量:name 存储你的名字(字符串,例如 "小明"),city 存储你所在的城市(字符串,例如 "北京")。使用 f-string 将这两个变量组合成一句话并打印出来。
● 输入: 无
● 输出: (请注意输出格式中的逗号和空格)
进阶思考:
● 如果想在输出的姓名两边加上引号,例如 姓名: "小明", 城市: 北京,f-string 语句应该怎么写?
● 只用一个 print() 和 f-string,如何让姓名和城市分两行输出?
注:函数将代码封装
“类”将长得差不多的函数和属性进行封装
“库”封装“类”
变量的基础运算
● 题目: 定义两个整数变量,num1 赋值为 20,num2 赋值为 8。计算这两个变量的和,并将结果存储在一个新的变量 a 中;计算这两个变量的商,叫做b;计算这两个变量的余数,叫做c。然后,使用 f-string 打印出类似 “20 加 8 的结果是:28” 的信息,分成三行打印。
● 题目: 定义两个浮点数变量,price 赋值为 19.9,discount 赋值为 0.8 (表示 8 折)。计算折扣后的价格,并将结果存储在变量 final_price 中;计算节省了多少钱,存储在变量 saved_amount 中。然后,使用 f-string 分两行打印出类似以下格式的信息:
最终价格是: 15.92
节省金额是: 3.98
今日先学到这里。本想把Day2的内容一起完成,但今日学习的内容还须好好再消化一下。今日通过这几个题对代码有点感觉了,比起昨天一头雾水的状态清晰了很多。须对每个代码是如何写出的有清晰的认识。明日再学习新内容前,自己亲手写一遍代码,以此检验。继续加油!
作者:Y317429