Python基础语法

  • 一、开发环境
    • 1.1虚拟机安装与设置
    • 1.2Linux命令
      • 1.2.1远程管理中的scp(secure copy)用于远程拷贝文件
      • 1.2.2用户权限(概念了解)
      • 1.2.3用户管理
      • 1.2.4切换用户
      • 1.2.5修改文件权限
      • 1.2.6系统信息相关命令
      • 1.2.7软件安装和压缩
    • 1.3Python语言与PyCharm
      • 1.3.1解释器
      • 1.3.2Python特点
      • 1.3.3第一个Python程序
      • 1.3.4PyCharm的初始设置
      • 1.3.5新建项目
      • 1.3.6多文件项目的演练
  • 二、数据类型与运算符
    • 2.1算数运算符
    • 2.2比较运算符
    • 2.3逻辑运算符
    • 2.4赋值运算符
    • 2.5数据类型
    • 2.6转义字符
  • 三、if语句
  • 四、循环
    • 4.1while循环
    • 4.2完整的for循环语法
    • 4.3break和continue
  • 五、函数基础
    • 5.1定义函数的格式如下:
    • 5.2使用模块中的函数
    • 5.3基础函数
  • 六、公共方法
    • 6.1Python的内置函数
    • 6.2切片
    • 6.3运算符
  • 七、函数提高
    • 7.1变量作用域
    • 7.2多函数程序执行流程
    • 7.3函数的返回值
    • 7.4函数的参数
      • 7.4.1位置参数
      • 7.4.2关键字参数
      • 7.4.3缺省参数
      • 7.4.4不定长参数
    • 7.5拆包与交换变量值
    • 7.6引用
      • 7.6.1了解引用
      • 7.6.2引用当做实参
    • 7.7可变类型与不可变类型
  • 八、递归函数
  • 九、匿名函数(lambda表达式)
  • 十、高阶函数与内置函数
    • 10.1高阶函数
      • 10.1.1体验高阶函数
    • 10.2内置高阶函数
      • 10.2.1map()
      • 10.2.2reduce()
      • 10.2.3filter()
  • 十一、文件操作
    • 11.1文件操作的作用
    • 11.2文件的基本操作
      • 11.2.1打开
      • 11.2.2读
      • 11.2.3seek()用以移动文件指针
    • 11.3文件备份
    • 11.4文件和文件夹的操作
      • 11.4.1文件的重命名与删除
      • 11.4.2文件夹与目录
      • 11.4.3批量重命名

  • 参考黑马程序员的免费教程。Python基础教程下载【黑马程序员完整版】

一、开发环境

1.1虚拟机安装与设置

  • 首先需要两个准备,第一个准备是在计算机上安装VMware虚拟机软件,下载地址:VMware官网,正常安装即可;

  • 第二个准备是在Ubantu官网下载Ubantu。安装完成时遇到两个问题,<1>配置完成后启动虚拟机,显示“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。”解决方案参照【此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。(如何进入系统BIOS设定)】。<2>虚拟机无法联网,解决方案参照【虚拟机(Ubantu)无法联网】。

  • 具体安装按窗口提示即可,以下是相关的设置。

设置内容设置方法
语言环境依次点击Settings>>Region&Language>>Manage Installed Languages>>Install/Remove Languages…>>勾选Chinese(simplified)>>Language选择或者拖动为Chinese>>Restart…
设置服务器镜像源(提高软件安装/更新速度)系统设置>>关于>>软件更新>>下载自>>其他站点>>选择最佳服务器(S)>>选择服务器(S)
启动栏添加终端图标找到后右键选择添加到收藏夹
使用apt更新和升级系统软件1.sudo apt install 软件名 //安装软件 2.sudo apt remove 软件名//卸载软件 3.sudo apt update/upgrade//可软件软件列表/更新已安装的软件
安装常用工具1.Python程序员:$ sudo apt install ipython $ sudo apt install ipython3 $ sudo apt install python-pip $ sudo apt install python3-pip 2.安装ssh服务器:$ sudo apt install openssh-server
删除软件$ sudo apt remove 软件
deb安装格式$ sudo dpkg -i <package.deb>

1.2Linux命令

Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux命令内容命令
文件和目录命令ls,cd,touch,mkdir,rm
拷贝和移动命令tree,cp,mv
文件内容命令cat,more,grep
远程管理命令ifconfig,ping,SSH的工作方式简介以及ssh命令
用户权限及用户管理命令chmod,chgrp,useradd,passwd,userdel
软件安装及压缩命令apt简介及命令,tar,gzip压缩命令,bzip2压缩命令
vim的基本使用

1.2.1远程管理中的scp(secure copy)用于远程拷贝文件

# 把本地当前目录下的01.py文件复制到远程家目录下的Desktop/01.py
scp -P port 01.py user@remote:Desktop/01.py

# 把远程家目录下的Desktop/01.py文件复制到本地当前目录下的01.py
scp -P port user@remote:Desktop/01.py 01.py

# 加上 -r 选项可以传送文件夹
# 把当前目录下的demo文件夹复制到远程家目录下的Desktop
scp -r demo user@remote:Desktop

# 把远程家目录下的Desktop复制到当前目录下的demo文件夹
scp -r user@remote:Desktop demo
选项含义
-r源文件为目录文件,scp将递归复制目录下的所有子目录和文件
-P若远程SSH服务器的端口不是22,需要使用大写字母-P选项指定端口

1.2.2用户权限(概念了解)

  • 对文件/目录的的权限包括:
序号权限英文缩写数字代号(二进制)
01readr4
02writew2
03执行excutex1
  • 预先对设置好权限,再将对应的用户添加进去,从而依次为每一个用户设置权限。

    ls -l显示的文件详细信息:目录-拥有者权限-组权限-其他用户权限-硬链接数-拥有者-组-大小-时间-文件或目录名称。其中硬链接数表示有多少种方式可以访问到当前目录/文件。
  • chmod修改用户/组对文件/目录的权限。
chmod +/-rwx 文件名/目录名
  • 超级用户
    Linux系统中的root账号用于系统的维护和管理,对操作细听的所有资源具有所有访问权限。
  • 组管理终端命令
    创建/删除组的终端命令都需要sudo执行。
序号命令作用
01groupadd 组名添加组
02groupdel 组名删除组
03cat /etc/group确认组信息(配置文件
04chgrp 组名 文件/目录名递归修改文件/目录的所属组

1.2.3用户管理

序号命令作用说明
01useradd -m -g 组 新建用户名创建用户-m:自动建立用户家目录;-g:指定用户所在组,否则会建立与用户同名的组
02passwd 用户名设置密码普通用户可直接使用修改自己的账户密码
03userdel -r 用户名删除用户-r选项会自动删除用户家目录
04cat /etc/passwd | grep 用户名确认用户信息新建的用户信息存储在/etc/passwd文件中
  • 查看用户信息
序号命令作用
01id [用户名]查看用户UID和GID信息
02who查看当前所有登录的用户列表
03whoami查看当前登录用户的账户名
  • passwd文件
    /etc/passwd文件存放的是用户的信息,由六个分号组成的7个信息,分别是
    用户名;密码(x表示已加密);UID(用户标识);GID(组标识);用户全名或者本地账号;家目录;登录使用的Shell(登陆之后使用的终端命令,Ubantu默认是dash)
  • usermod
    usermod可以用以设置用户的主组/附加组合登录Shell
    主组:在新建用户的时候指定,在/etc/passwd的第四列GID对应的组。
    附加组:在/etc/group中最后一列表示该组的用户列表,用于指定用户的附加权限。
# 修改用户的主组(passwd中的GID)
usermod -g 组 用户名

# 修改用户的附加组   (重新登录才生效)
usermod -G 组 用户名

# 修改用户登录Shell
usermod -s /bin/bash 用户名

# 默认useradd添加的用户无权限使用sudo以root身份执行命令
# 使用下述命令句将用户添加到sudo附加组中
usermod -G sudo 用户名

1.2.4切换用户

序号命令作用说明
01su - 用户名切换用户并切换目录-可以切换到用户家目录,否则保持位置不变
02exit退出当前登录用户
  • su不接用户名,可以切换到root,但是不推荐使用,因为不安全。
  • exit示意图如下:

1.2.5修改文件权限

序号命令作用
01chown修改拥有者
02chgrp修改组
03chmod修改权限
  • 命令格式
# 修改文件/目录拥有者
$ chown 用户名 文件名/目录名

# 递归修改文件/目录的组
$ chgrp -R 组名 文件名/目录名

# 递归修改文件权限(数字:二进制)
$ chmod -R 755 文件名/目录名

# 直接修改文件/目录的 读/写/执行 权限,但是不能精确到拥有者/组/其他用户
$ chmod +/- rwx 文件名/目录名
  • 文件权限用二进制表示
拥有者其他
r ;w;xr;w;xr;w;x
4;2;14;2;14;2;1

1.2.6系统信息相关命令

序号命令作用
01date查看系统时间
02calcalendar查看日历,-y选项显示一年的日历
03df -hdisk free显示磁盘剩余空间
04du -h [目录名]disk usage显示目录下的文件大小
05ps auxprocess status查看进程的详细情况 (选项含义在下个表格中介绍)
06top动态显示运行中的进程并排序 ,输入q退出top
07kill [-9] 进程代号终止指定代号(PID)的进程,-9表示强行终止
08find [路径] -name “*.py”查找指定路径下所有扩展名为-py的文件
09ln -s 被链接的源文件 链接文件建立文件的软链接(快捷方式) —注意不带-s选项建立的是硬链接,会很占空间;源文件要用绝对路径
  • -h选项的作用:更人性化地显示信息(计量单位)
  • ps选项说明
选项含义
a显示终端所有进程(包括其他用户)
u显示进程的详细状态
x显示没有控制终端的进程

1.2.7软件安装和压缩

序号命令作用
01tar(打包)1打包文件 tar -cvf 打包文件.tar 被打包的文件/路径...;2解包文件tar -xvf 打包文件.tar
02gzip(压缩)1压缩文件 tar -zcvf 打包文件.tar.gz 被打包的文件/路径...;2解压缩文件tar -zxvf 打包文件.tar.gz ;3解压缩到指定路径tar -zxvf 打包文件.tar.gz -C 目标路径
03bzip21压缩文件 tar -jcvf 打包文件.tar.bz2 被打包的文件/路径...;2解压缩文件tar -jxvf 打包文件.tar.bz2 ; 3解压缩到指定路径tar -jxvf 打包文件.tar.bz2 -C 目标路径
04apt1安装软件sudo apt install 软件包 ;2卸载软件sudo apt remove 软件名;3更新已安装的包sudo apt upgrate
  • tar选项说明
选项含义
c生成档案文件,创建打包文件
x解开档案文件
v列出归档归档解档的详细过程,显示进度
f指定档案文件名称,f后面一定是.tar 文件,所以必须放在选项最后
  • apt
# 一个小火车提示
$ sudo apt install sl

# 一个比较漂亮的查看当前进程排名的软件
$ sudo apt install htop
  • 软件源参考前面1.1虚拟机安装与设置

1.3Python语言与PyCharm

1.3.1解释器

  • 编译器:将其他语言翻译成机器语言的工具。
  • 当编译器以解释方式运行的时候,也称为解释器
  • 编译型语言(C、C++)执行速度快,但跨平台性差。
  • 解释性语言(Java、Python等)跨平台性好,执行速度稍逊。

1.3.2Python特点

  • 完全面向对象
  • 拥有一个强大的标准库
  • Python社区提供了大量的第三方模块

1.3.3第一个Python程序

  • 解释器—python/python3
  • 交互式—ipython/ipython3
  • 集成开发环境(IDE)—PyCharm
$ cd Destop/
$ touch 01-HelloPython.py
$ gedit 01-HelloPython.py
# 编辑完Python代码后,用解释器执行
$ python3 01-HelloPython.py
  • print函数的作用,类似于C++中的cout
print("Hello Python")
print("Hello World")

1.3.4PyCharm的初始设置

  • 安装PyCharm(Linux系统下)
# 1.Linux系统下,解压下载后的安装包
$ tar -zxvf pycharm-community-2021.3.2.tar.gz

# 2.将解压缩的目录移动到“/opt”目录下,可以方便其他用户的使用
$ sudo mv pycharm-community-2021.3.2/ /opt/

# 3.启动PyCharm
$ /opt/pycharm-community-2021.3.2/bin/pycharm.sh

# Linux系统下恢复PyCharm的初始设置:关闭PyCharm后,执行
$ rm -r ~/.PyCharm2021.3
  • 卸载PyCharm(Linux系统下)
# 1.删除压缩目录
$ sudo rm -r /opt/pycharm-community-2021.3.2/

# 2.删除家目录下用于保存配置信息的隐藏目录
$ rm -r ~/.PyCharm2021.3/

# 3.如果不再使用PyCharm,还要删除/usr/share/applications/下的
# jetbrains-pycharm.desktop。(删除软链接——快捷方式)

1.3.5新建项目

  • 命名文件名建议使用小写字母数字下划线
  • 文件名不能以数字开始
  • 通过欢迎界面或者菜单File>>New Project可以新建项目
  • 命名规则,摘自Python风格指南(Google)。

模块名写法: module_name ;
包名写法: package_name ;
类名: ClassName ;
方法名:method_name ;
异常名: ExceptionName ;
函数名: function_name ;
全局常量名:GLOBAL_CONSTANT_NAME ;
全局变量名: global_var_name ;
实例名:instance_var_name ;
函数参数名: function_parameter_name ;
局部变量名: local_var_name .
函数名,变量名和文件名应该是描述性的,尽量避免缩写,特别要避免使用非项目人员不清楚难以理解的缩写,不要通过删除单词中的字母来进行缩写。始终使用.py 作为文件后缀名,不要用破折号。

1.3.6多文件项目的演练

  • 开发项目就是开发一个专门解决一个复杂业务功能的软件
  • 通常每个项目就具有一个独立专属的目录,用于保存所有和项目相关的文件
  • 一个项目通常含有很多源文件

二、数据类型与运算符

2.1算数运算符

  • 算数运算符+,-,*,/,//,%,**。
  • 其中*还可以计算出字符串重复指定次数的结果。
  • 优先级同C++(由高到低排列)
运算符描述
**幂(最高优先级)
* / % //乘、除、取余数、取整数
+ -加法、减法

2.2比较运算符

与C++类似:==,!=,>,<,>=,<=

2.3逻辑运算符

  • and
  • or
  • not

2.4赋值运算符

=,+=,-=,*=,/=,//=,%=,**=

2.5数据类型

  • 数据类型:数字型与非数字型
  • 数字型:整型(int)、浮点型(float)、布尔型(bool)、复数型(complex)
  • 非数字型字符串、列表、元组、字典
  • 在Python中,所有非数字型变量都支持一下特点
    1.都是一个序列sequence,也可以理解为容器
    2.取值[]
    3.遍历for in
    4.计算长度、最大/最小值、比较、删除
    5.链接+和重复*
    6.切片

  • <1>列表是Python中使用最频繁的数据类型,在C++中可类比为数组
    应用场景:列表一般都存储相同类型的数据;通过迭代遍历,在循环体内部针对列表元素执行相同操作
# 列表变量name_list
name_list = ["zhangsan", "lisi", "wangwu"]

# 循环遍历,每次循环变量都会保存在name变量中
for name in name_list:
	循环内部针对列表元素的操作
	print(name)
序号分类关键字/函数/方法说明
01增加列表.insert(索引,数据)在指定位置插入数据
列表.append(数据)在末尾追加数据
列表.extend(列表2)将列表2的数据追加到列表
02修改列表[索引] = 数据修改指定索引的数据
03删除del 列表[索引]删除指定索引的数据
列表.remove[数据]删除第一个出现的指定数据
列表.pop删除末尾数据
列表.pop(索引)删除指定索引数据
列表.clear清空列表
04统计len(列表)列表长度
列表.count(数据)数据在列表中出现的次数
05排序列表.sort()升序
列表.sort(reverse=True)降序
列表.reverse()逆序、反转

  • <2>元组(Tuple)与列表类似,但是元组的元素不能修改,且用()定义
info_tuple = ("zhangsan", 18, 1.75)

# 创建空元组
empty_tuple = ()

# 元组中只有一个元素时必须在元素后添加逗号,否则即是一个int变量的定义
single_tuple = (5, )

# 迭代遍历
for my_info in info_tuple:
	print(my_info)

# 元组与列表转换
list(元组)
tuple(列表)

  • <3>字典(dictionary)是无序的对象集合,用{}定义,与C++中的结构体有异曲同工之妙
    key是索引,只能使用字符串、数字或元组;
    value是数据,可以取任何数据;
    ==len(字典)==获取字典的键值对数量。
xiaoming_dict = {"name": "小明",
			"age": 18,
			"gender": True
			"height": 1.75
			"weight": 55}
print(xiaoming_dict)

tiny_dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del tiny_dict['Name']  # 删除键 'Name'
tiny_dict.clear()  # 清空字典
tiny_dict.update(xiaoming_dict)  #合并字典,优先使用新字典键值
del tiny_dict  # 删除字典

2.6转义字符

转义字符描述
\反斜杠
单引号
"双引号
\n换行
\t横向制表符,垂直方向对齐
\r回车

三、if语句

# if与elif
if 条件1:
    条件1成立时,要做的事情
    ...
elif 条件2:
	 条件2成立时,要做的事情
    ...
else:
    以上条件都不满足执行的代码
    ...

# if的嵌套
if 条件1:
    条件1成立时,要做的事情
    ...
    if 条件1基础上的条件2:
        条件2成立时,要做的事情
        ...
else:
    条件1不成立时,要做的事情
    ...
  • 注意:在Python开发中,Tab和空格不要混用!代码的缩进建议使用4个空格。

四、循环

三大流程方式:顺序、分支、循环

4.1while循环

# while 循环
i = 0  # 计数器(程序计数法常从零开始)
while i < 5:  # 条件
    print("Hello Python")
    i += 1

4.2完整的for循环语法

for 变量 in 集合:
	循环体代码
else:
	没有通过 break 退出循环,循环结束后,会执行的代码

4.3break和continue

  • break某一条件满足时,退出循环,不再执行后续重复的代码。
  • continue某一条件满足时,不执行后续重复的代码,使用的时候注意计数器是否变化,以避免出现死循环。

breakcontinue只对当前所在循环有效

五、函数基础

5.1定义函数的格式如下:

# 这里下方要空两行


def 函数名():
	"""函数说明"""  # 在调用出 CtroL + Q 可以查询函数说明

    函数封装的代码
    ......


def sum_2_sum(num1, num2):  # num1、num2为形参
	"""俩数求和"""
	
	return num1 + num2  # 返回值


result = sum_2_sum(10, 40)  # 此处10与40为实参
print("输出结果为%d" % result)

5.2使用模块中的函数

模块是Python程序架构的一个核心概念

  • pyc文件是由Python解释器将模块的源码转换为字节码,作为一种启动速度的优化

5.3基础函数

# 1.将x输出到控制台
print(x)
print("格式化字符串" % 变量1)
print("格式化字符串" % (变量1, 变量2, 变量3, ...))
print("*", end="")  # 下次输出不换行
print("")  # 换行

# 2.查看x的变量类型
type(x)

# 3.键盘输入的都是字符串类型
number_string = input("请输入数据:")

# 4.类型准换
number_int = int(number_string)
number_float = float(number_string)

# 5.随机数的处理
import random  # 导入随机数模块

random.randint(10, 20)  # 生成随机数n:10 <= n <= 20

补充:

  • 变量的格式化输出(包含%的字符串被称为格式化字符串)
# 语法格式如下
print("格式化字符串" % 变量1)
print("格式化字符串" % (变量1, 变量2, 变量3, ...))
格式化字符含义
%s字符串
%d有符号十进制整数, %06d表示输出的整数显示位数,不足的用0补全
%f浮点数, %.2f表示小数点后保留位数
%%输出%

六、公共方法

6.1Python的内置函数

Python包含了一下内置函数:

函数描述备注
len(item)计算容器中元素个数
del(item)删除变量del有两种方式
max(item)返回容器中元素最大值字典只比较key
min(item)返回容器中元素最小值字典只比较key
cmp(item1, item2)比较两个值,-1 小于/0 相等/1 大于Python3.x取消了该函数

6.2切片

描述Python表达式结果支持的数据类型
切片“0123456789” [::-2]“97531”字符串、列表、元组

6.3运算符

运算符Python运算符结果描述支持的数据类型
+[1, 2] + [3, 4][1, 2, 3, 4]合并字符串、列表、元组
*[“Hi”] * 4[“Hi”, “Hi”, “Hi”, “Hi”]重复字符串、列表、元组
in3 in (1, 2, 3)True元素是否存在字符串、列表、元组、字典
not in4 not in (1, 2, 3)True元素是否不存在字符串、列表、元组 、字典
> >= == < <=(1, 2, 3) < (2, 2, 3)True元素比较字符串、列表、元组

七、函数提高

7.1变量作用域

局部变量全局变量

  • 局部变量,就是在函数内部定义的变量。当函数调用时,局部变量被创建,当函数调用完成后这个变量立即销毁。
  • 在函数外边定义的变量叫做全局变量,全局变量能够在所有的函数中进行访问。
# 函数体内部修改全局变量
a = 100


def test():
	# global 关键字声明 a 是全局变量
	global a
	a = 200
	print(a)


print(a)

7.2多函数程序执行流程

一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,这种场景是经常出现的,因此下面来总结下,多个函数中共享数据的几种方式。

  1. 使用全局变量
  2. 使用函数的返回值、参数
  3. 函数嵌套调用

7.3函数的返回值

  • 如果return后面有多个数据,那么默认是元组
def divid(a, b):
    shang = a//b
    yushu = a%b 
    return shang, yushu  #默认是元组

result = divid(5, 2)
print(result)  # 输出(2, 1)
  • return后面可以是元组,列表、字典等,只要是能够存储多个数据的类型,就可以一次性返回多个数
def function():
      # return [1, 2, 3]
      # return (1, 2, 3)
      return {"num1": 1, "num2": 2, "num3": 3}

7.4函数的参数

7.4.1位置参数

def usr_info(name, age, gender):
	print("%s:年龄%d;性别%s" % (name, age, gender))

usr_info("小明", 18, "男")

7.4.2关键字参数

  • 函数调用,通过“键=值”的形式加以指定,清除了关键字参数的顺序要求。
def usr_info(name, age, gender):
	print("%s:年龄%d;性别%s" % (name, age, gender))


usr_info("小明", 18, "男")
usr_info("小明", gender="男", age=18)  # 注意位置参数要在关键字参数之前

7.4.3缺省参数

  • 调用函数时,缺省参数的值如果没有传入,则取默认值。
  • 注意:带有默认值的参数一定要位于参数列表的最后面
def printinfo(name, age=35, gender="男"):
   # 打印任何传入的字符串
   print("name: %s" % name)
   print("age %d" % age)
   print("name: %s" % gender)

# 调用printinfo函数
printinfo(name="miki")  # 在函数执行过程中 age取默认值35, gender取“男”
printinfo(age=9 ,name="miki", gender="女")

7.4.4不定长参数

  • 加了星号 * 的变量args会存放所有未命名的变量参数,args为元组

  • 而加 ** 的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典.

  • 注意:如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有**kwargs的话,**kwargs必须是最后的

7.5拆包与交换变量值

  • 拆包元组
def get_my_info():
    high = 178
    weight = 100
    age = 18
    return high, weight, age


# result = get_my_info()
# print(result)

my_high, my_weight, my_age = get_my_info()
print(my_high)
print(my_weight)
print(my_age)
  • 拆包字典
def get_info():
	return{"name":"xiaoming", "age":22}


a, b = get_info()
print(get_info()[a])
print(get_info()[b])
  • 交换变量值
# 第 1 种方式
# a = 4
# b = 5
# c = 0
#
# c = a
# a = b
# b = c
#
# print(a)
# print(b)

# 第 2 种方式
# a = 4
# b = 5
# a = a+b  # a=9, b=5
# b = a-b  # a=9, b=4
# a = a-b  # a=5, b=4
# print(a)
# print(b)

# 第 3 种方式
a, b = 4, 5
a, b = b, a

print(a)
print(b)

7.6引用

7.6.1了解引用

  • 在python中,值是靠引用来传递来的。

  • 我们可以用id()来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标示。

7.6.2引用当做实参

def test1(b):  # 变量b一定是一个局部变量,就看它指向的是谁?可变还是不可变
    b += b  # 地址(id(b))改变
    print(id(b))
    # b = b+b  # xx = xx+yyy 先把=号右边的结果计算出来,然后让b指向这个新的地方,
                # 不管原来b指向谁,现在b一定指向这个新的地方

# a = [11, 22]
a = 100
print(f"a的原始地址是id(a)")
test1(a)
print(a)

7.7可变类型与不可变类型

  • 所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变。
  • 可变类型有: 列表、字典、集合
  • 不可变类型有: 数字、字符串、元组

八、递归函数

  • 应用场景
  1. 遍历文件夹下所有文件;
  2. 算法课程,例如:快速排序。
  • 递归的特点 (☆☆☆☆☆)
    – 函数内部自己调用自己
    – 必须有出口
# 整数以内所有正整数的和
def num_summer(num):
    if num == 1:
        return num
    return num + num_summer(num - 1)
print(num_summer(6))

九、匿名函数(lambda表达式)

  • 函数可以做为参数传递给另外一个函数, 可以使得函数的实现更加通用
  • 匿名函数也可以作为参数传递给另外一个函数, 对于只需要用到一次函数, 可以通过匿名函数减少代码量
# 带判断的lambda
my_function = lambda a, b: a + b if a == b else b
print(my_function(5, 6))

# 同此,且不会引起PYCharm的波浪号规范建议
print((lambda a, b: a + b)(6, 5))
def my_function(func):
    a = 100
    b = 200
    # 把 cucalate_rule 当做函数来调用
    result = func(a, b)
    print('result:', result)


my_function(lambda a, b: a / b)
my_function(lambda a, b: a // b)
my_function(lambda a, b: a % b)
# 可变参数*args与关键字参数**kwargs
fn1 = lambda *args: args
print(fn1(10, 20, 30))

fn2 = lambda **kwargs: kwargs
print(fn2(name="Python", age=20))
  • 使用匿名函数进行列表内字典排序
students = [
    {'name': 'Tom', 'age': 18},
    {'name': 'Jerry', 'age': 20},
    {'name': 'Tack', 'age': 19}
]
print(students)
students.sort(key=lambda x: x['age'])
print(students)

十、高阶函数与内置函数

10.1高阶函数

  • 把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指着种高度抽象的编程范式,减少了代码的重复,开发速度较快。

10.1.1体验高阶函数

# 求绝对值
abs(-10)  # 10
# 四舍五入
round(1.2)  # 1
round(1.9)  # 2


def sum_num(a, b, f):
    return f(a) + f(b)


result = sum_num(-9, 4, abs)
print(result)

10.2内置高阶函数

10.2.1map()

  • map(func, lst),将传入的func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)或者“迭代器(Python3)”返回。
# 计算列表中各个数字的平方


def func(x):
    return x ** 2


num_list = [1, 2, 3, 4, 5]
result = map(func, num_list)
print(result)  # <map object at 0x000001F168A8FFA0>
print(list(result))  # [1, 4, 9, 16, 25]

10.2.2reduce()

  • reduce(func, lst),其中func必须有两个参数。每次 func计算的结果继续和序列的下一个元素做累积计算(个人理解:即将lst中的所有数字都做了func计算)。

注意:reduce()传入的参数func必须接收2个参数

# 计算列表中各个数字的累加和。
import functools


def func1(x, y):
    return x + y


num_list1 = [1, 2, 3, 4, 5]
result1 = functools.reduce(func1, num_list1)
print(result1)

10.2.3filter()

  • filter(func, lst)函数用铝过滤序列,过滤掉不符合条件的元素,返回一个filter对象。可以用list()转为列表。
def func2(a):
    return a % 2 == 0


num_list2 = []
for x in range(1, 11):
    num_list2.append(x)
result2 = filter(func2, num_list2)
print(result2)  # <filter object at 0x000001D316BA1E50>
print(list(result2))  # [2, 4, 6, 8, 10]

十一、文件操作

11.1文件操作的作用

  • 就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。

11.2文件的基本操作

11.2.1打开

file = open(name, mode)  # file 是一个对象,与C++相似
  • name:是要打开的目标文件名的字符串(可包含文件所在具体路径)
  • mode:设置打开文件的访问模式:只读、写入、追加等等

11.2.2读

  • read()
# 文件对象.read(num)  num表示读取的字节长度,若不写则默认全部读取
test_txt_file = open('test.txt', 'r')
print(test_txt_file.read())
test_txt_file.close()
  • readlines() 该方法下读取文件所有内容,返回一个列表,每一行的数据作为一个元素。
test_txt_file = open('test.txt', 'r')
print(test_txt_file.readlines())  # ['qqqq\n', 'zxcz\n', 
                                  #'aaaa\n', 'sad\n', 'aasdasd']
test_txt_file.close()
  • readline()一次读取一行内容
test_txt_file = open('test.txt', 'r')
print('第一行:%s' % test_txt_file.readline())
print('第二行:%s' % test_txt_file.readline())
test_txt_file.close()
# 第一行:qqqq
# 第二行:zxcz

注意:读的内容永远在指针之后。譬如,在’a+'模式下直接读取内容,是空白文件。

11.2.3seek()用以移动文件指针

文件对象.seek(偏移量, 起始位置)

起始位置:

  • 0:文件开头
  • 1:当前位置
  • 2:文件结尾

11.3文件备份

需求:输入文件的名字,然后程序自动完成对文件进行备份

步骤:1.接收用户输入的文件名;2.规划备份文件名;3.备份文件写入数据

old_filename = input("请输入您要备份的文件名:")
index = old_filename.rfind('.')
print(old_filename[:index])
print(old_filename[index:])
if index > 0:  # 有效文件才备份
    new_filename = old_filename[:index] + \
                   "[备份]" + old_filename[index:]
# file = open(old_filename, 'a')  # 假设刚好是备份这个文件
# file.close()
print(new_filename)
old_file = open(old_filename, 'rb')
new_file = open(new_filename, 'wb')
while True:
    live_con = old_file.read(1024)
    if len(live_con) != 0:
        new_file.write(live_con)
    else:
        break
old_file.close()
new_file.close()

11.4文件和文件夹的操作

  • 在Python中文件和文件夹的操作要借助os模块里面的相关功能,步骤如下:
import os  # 1.导入os模块
os.函数名()  # 2.适应os模块的相关功能

11.4.1文件的重命名与删除

os.rename(目标文件名, 新文件名)
os.remove(目标文件名)

11.4.2文件夹与目录

os.mkdir(文件夹名字)  # 创建文件夹
os.rmdir(文件夹名字)  # 删除文件夹
os.getcwd()  # 获取当前目录
os.chdir(目录)  # 改变默认目录
os.listdir(目录)  # 获取 目录 列表
os.rename(目标文件夹名, 新文件夹名)

11.4.3批量重命名

  • 添加字符串
file_list = os.listdir()
for post_name in file_list:
    new_name = 'Python_' + post_name
    os.rename(post_name, new_name)
  • 删除字符串
file_list = os.listdir()
flag = 2  # 构造条件的数据
for post_name in file_list:
    if flag == 1:
        new_name = 'Python_' + post_name
    elif flag == 2:
        num = len('Python_')
        new_name = post_name[num:]
    os.rename(post_name, new_name)

该阶段正式进入Python这门语言的学习,首先通过了解Python语言的起源,Python语言的设计目标,Python语言的设计哲学,Python语言的优缺点和面向对象的基本概念,以及Python语言的执行方式,还有Python集成开发环境PyCharm的使用为我们接下来的学习做铺垫。

然后会学习int,string,float三种简单的变量类型,变量间的计算,变量的输入输出,if判断语句,while循环语句,for循环语句,break和continue的使用,函数的基本使用,模块的使用,列表,元组,字典三种高级变量,字符串的常用操作。

接下来会通过一个名片管理系统的案例,把这一阶段的知识进行一个串联。在学习名片管理系统时,首先我们会学习怎么去搭建这一系统的框架,然后我们会分别实现新增名片,显示全部名片,查询名片,删除名片,修改名片这些功能。

最后会学习语法的进阶内容,全局变量,局部变量,可变数据类型和不可变数据类型以及函数返回多个值,函数的缺省参数,多值参数,递归的基本使用。

写代码一定要注意Tab缩进与空格不要混用!

更多推荐

Python学习日记(初级篇01基础语法)——黑马程序员视频学习笔记