第二个准备是在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 |
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的基本使用 |
# 把本地当前目录下的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选项指定端口 |
序号 | 权限 | 英文 | 缩写 | 数字代号(二进制) |
---|---|---|---|---|
01 | 读 | read | r | 4 |
02 | 写 | write | w | 2 |
03 | 执行 | excute | x | 1 |
ls -l
显示的文件详细信息:目录-拥有者权限-组权限-其他用户权限-硬链接数-拥有者-组-大小-时间-文件或目录名称。其中硬链接数表示有多少种方式可以访问到当前目录/文件。chmod +/-rwx 文件名/目录名
序号 | 命令 | 作用 |
---|---|---|
01 | groupadd 组名 |
添加组 |
02 | groupdel 组名 |
删除组 |
03 | cat /etc/group |
确认组信息(配置文件) |
04 | chgrp 组名 文件/目录名 |
递归修改文件/目录的所属组 |
序号 | 命令 | 作用 | 说明 |
---|---|---|---|
01 | useradd -m -g 组 新建用户名 |
创建用户 | -m:自动建立用户家目录;-g:指定用户所在组,否则会建立与用户同名的组 |
02 | passwd 用户名 |
设置密码 | 普通用户可直接使用修改自己的账户密码 |
03 | userdel -r 用户名 |
删除用户 | -r选项会自动删除用户家目录 |
04 | cat /etc/passwd | grep 用户名 |
确认用户信息 | 新建的用户信息存储在/etc/passwd文件中 |
序号 | 命令 | 作用 |
---|---|---|
01 | id [用户名] | 查看用户UID和GID信息 |
02 | who | 查看当前所有登录的用户列表 |
03 | whoami | 查看当前登录用户的账户名 |
# 修改用户的主组(passwd中的GID)
usermod -g 组 用户名
# 修改用户的附加组 (重新登录才生效)
usermod -G 组 用户名
# 修改用户登录Shell
usermod -s /bin/bash 用户名
# 默认useradd添加的用户无权限使用sudo以root身份执行命令
# 使用下述命令句将用户添加到sudo附加组中
usermod -G sudo 用户名
序号 | 命令 | 作用 | 说明 |
---|---|---|---|
01 | su - 用户名 | 切换用户并切换目录 | -可以切换到用户家目录,否则保持位置不变 |
02 | exit | 退出当前登录用户 |
序号 | 命令 | 作用 |
---|---|---|
01 | chown | 修改拥有者 |
02 | chgrp | 修改组 |
03 | chmod | 修改权限 |
# 修改文件/目录拥有者
$ chown 用户名 文件名/目录名
# 递归修改文件/目录的组
$ chgrp -R 组名 文件名/目录名
# 递归修改文件权限(数字:二进制)
$ chmod -R 755 文件名/目录名
# 直接修改文件/目录的 读/写/执行 权限,但是不能精确到拥有者/组/其他用户
$ chmod +/- rwx 文件名/目录名
拥有者 | 组 | 其他 |
---|---|---|
r ;w;x | r;w;x | r;w;x |
4;2;1 | 4;2;1 | 4;2;1 |
序号 | 命令 | 作用 |
---|---|---|
01 | date | 查看系统时间 |
02 | cal | calendar查看日历,-y选项显示一年的日历 |
03 | df -h | disk free显示磁盘剩余空间 |
04 | du -h [目录名] | disk usage显示目录下的文件大小 |
05 | ps aux | process status查看进程的详细情况 (选项含义在下个表格中介绍) |
06 | top | 动态显示运行中的进程并排序 ,输入q退出top |
07 | kill [-9] 进程代号 | 终止指定代号(PID)的进程,-9表示强行终止 |
08 | find [路径] -name “*.py” | 查找指定路径下所有扩展名为-py的文件 |
09 | ln -s 被链接的源文件 链接文件 | 建立文件的软链接(快捷方式) —注意不带-s选项建立的是硬链接,会很占空间;源文件要用绝对路径 |
选项 | 含义 |
---|---|
a | 显示终端所有进程(包括其他用户) |
u | 显示进程的详细状态 |
x | 显示没有控制终端的进程 |
序号 | 命令 | 作用 |
---|---|---|
01 | tar(打包) | 1打包文件 tar -cvf 打包文件.tar 被打包的文件/路径... ;2解包文件tar -xvf 打包文件.tar |
02 | gzip(压缩) | 1压缩文件 tar -zcvf 打包文件.tar.gz 被打包的文件/路径... ;2解压缩文件tar -zxvf 打包文件.tar.gz ;3解压缩到指定路径tar -zxvf 打包文件.tar.gz -C 目标路径 |
03 | bzip2 | 1压缩文件 tar -jcvf 打包文件.tar.bz2 被打包的文件/路径... ;2解压缩文件tar -jxvf 打包文件.tar.bz2 ; 3解压缩到指定路径tar -jxvf 打包文件.tar.bz2 -C 目标路径 |
04 | apt | 1安装软件sudo apt install 软件包 ;2卸载软件sudo apt remove 软件名 ;3更新已安装的包sudo apt upgrate |
选项 | 含义 |
---|---|
c | 生成档案文件,创建打包文件 |
x | 解开档案文件 |
v | 列出归档归档解档的详细过程,显示进度 |
f | 指定档案文件名称,f后面一定是.tar 文件,所以必须放在选项最后 |
# 一个小火车提示
$ sudo apt install sl
# 一个比较漂亮的查看当前进程排名的软件
$ sudo apt install htop
$ cd Destop/
$ touch 01-HelloPython.py
$ gedit 01-HelloPython.py
# 编辑完Python代码后,用解释器执行
$ python3 01-HelloPython.py
print("Hello Python")
print("Hello World")
# 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
# 1.删除压缩目录
$ sudo rm -r /opt/pycharm-community-2021.3.2/
# 2.删除家目录下用于保存配置信息的隐藏目录
$ rm -r ~/.PyCharm2021.3/
# 3.如果不再使用PyCharm,还要删除/usr/share/applications/下的
# jetbrains-pycharm.desktop。(删除软链接——快捷方式)
模块名写法:
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 作为文件后缀名,不要用破折号。
运算符 | 描述 |
---|---|
** | 幂(最高优先级) |
* / % // | 乘、除、取余数、取整数 |
+ - | 加法、减法 |
与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() |
逆序、反转 |
info_tuple = ("zhangsan", 18, 1.75)
# 创建空元组
empty_tuple = ()
# 元组中只有一个元素时必须在元素后添加逗号,否则即是一个int变量的定义
single_tuple = (5, )
# 迭代遍历
for my_info in info_tuple:
print(my_info)
# 元组与列表转换
list(元组)
tuple(列表)
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 # 删除字典
转义字符 | 描述 |
---|---|
\ | 反斜杠 |
’ | 单引号 |
" | 双引号 |
\n | 换行 |
\t | 横向制表符,垂直方向对齐 |
\r | 回车 |
# if与elif
if 条件1:
条件1成立时,要做的事情
...
elif 条件2:
条件2成立时,要做的事情
...
else:
以上条件都不满足执行的代码
...
# if的嵌套
if 条件1:
条件1成立时,要做的事情
...
if 条件1基础上的条件2:
条件2成立时,要做的事情
...
else:
条件1不成立时,要做的事情
...
三大流程方式:顺序、分支、循环
# while 循环
i = 0 # 计数器(程序计数法常从零开始)
while i < 5: # 条件
print("Hello Python")
i += 1
for 变量 in 集合:
循环体代码
else:
没有通过 break 退出循环,循环结束后,会执行的代码
break
和continue
只对当前所在循环有效
# 这里下方要空两行
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)
模块是Python程序架构的一个核心概念
# 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表示小数点后保留位数 |
%% | 输出% |
Python包含了一下内置函数:
函数 | 描述 | 备注 |
---|---|---|
len(item) | 计算容器中元素个数 | |
del(item) | 删除变量 | del有两种方式 |
max(item) | 返回容器中元素最大值 | 字典只比较key |
min(item) | 返回容器中元素最小值 | 字典只比较key |
cmp(item1, item2) | 比较两个值,-1 小于/0 相等/1 大于 | Python3.x取消了该函数 |
描述 | Python表达式 | 结果 | 支持的数据类型 |
---|---|---|---|
切片 | “0123456789” [::-2] | “97531” | 字符串、列表、元组 |
运算符 | Python运算符 | 结果 | 描述 | 支持的数据类型 |
---|---|---|---|---|
+ | [1, 2] + [3, 4] | [1, 2, 3, 4] | 合并 | 字符串、列表、元组 |
* | [“Hi”] * 4 | [“Hi”, “Hi”, “Hi”, “Hi”] | 重复 | 字符串、列表、元组 |
in | 3 in (1, 2, 3) | True | 元素是否存在 | 字符串、列表、元组、字典 |
not in | 4 not in (1, 2, 3) | True | 元素是否不存在 | 字符串、列表、元组 、字典 |
> >= == < <= | (1, 2, 3) < (2, 2, 3) | True | 元素比较 | 字符串、列表、元组 |
局部变量和全局变量
# 函数体内部修改全局变量
a = 100
def test():
# global 关键字声明 a 是全局变量
global a
a = 200
print(a)
print(a)
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,这种场景是经常出现的,因此下面来总结下,多个函数中共享数据的几种方式。
def divid(a, b):
shang = a//b
yushu = a%b
return shang, yushu #默认是元组
result = divid(5, 2)
print(result) # 输出(2, 1)
def function():
# return [1, 2, 3]
# return (1, 2, 3)
return {"num1": 1, "num2": 2, "num3": 3}
def usr_info(name, age, gender):
print("%s:年龄%d;性别%s" % (name, age, gender))
usr_info("小明", 18, "男")
def usr_info(name, age, gender):
print("%s:年龄%d;性别%s" % (name, age, gender))
usr_info("小明", 18, "男")
usr_info("小明", gender="男", age=18) # 注意位置参数要在关键字参数之前
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="女")
加了星号 * 的变量args会存放所有未命名的变量参数,args为元组
而加 ** 的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典.
注意:如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有**kwargs的话,**kwargs必须是最后的
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)
在python中,值是靠引用来传递来的。
我们可以用id()
来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标示。
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)
# 整数以内所有正整数的和
def num_summer(num):
if num == 1:
return num
return num + num_summer(num - 1)
print(num_summer(6))
# 带判断的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)
# 求绝对值
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)
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) #
print(list(result)) # [1, 4, 9, 16, 25]
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)
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) #
print(list(result2)) # [2, 4, 6, 8, 10]
file = open(name, mode) # file 是一个对象,与C++相似
# 文件对象.read(num) num表示读取的字节长度,若不写则默认全部读取
test_txt_file = open('test.txt', 'r')
print(test_txt_file.read())
test_txt_file.close()
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()
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+'模式下直接读取内容,是空白文件。
文件对象.seek(偏移量, 起始位置)
起始位置:
需求:输入文件的名字,然后程序自动完成对文件进行备份
步骤: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()
import os # 1.导入os模块
os.函数名() # 2.适应os模块的相关功能
os.rename(目标文件名, 新文件名)
os.remove(目标文件名)
os.mkdir(文件夹名字) # 创建文件夹
os.rmdir(文件夹名字) # 删除文件夹
os.getcwd() # 获取当前目录
os.chdir(目录) # 改变默认目录
os.listdir(目录) # 获取 目录 列表
os.rename(目标文件夹名, 新文件夹名)
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缩进与空格不要混用!