Python学习从0开始——004版本升级和定义函数
一、match+版本升级
match是Python3.10以后的新特性,当前系统的版本为3.8,用不了。以下操作没有解决编译器报错问题,但是终端可以正常运行含有match的函数,可跳过。
#打开右侧的终端,在终端执行以下命令
#输入:查看系统命令
cat /etc/os-release
#输出
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.5 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
尝试版本升级,升级到3.10.4
#打开右侧的终端,在终端执行以下命令
#通过git克隆pyenv的仓库并修改配置
git clone https://github.com/pyenv/pyenv.git ~/.pyenv #可能要执行两次,第一次在80左右会断掉,再执行一次就可以
#或者 git clone https://gitee.com/chenshuchuan/pyenv.git ~/.pyenv 用gitee快一点
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec "$SHELL"
#使用pyenv安装Python
pyenv install 3.10.4 #有点慢,然后有警告,缺少几个模块
#使用sudo命令安装缺少模块,首先安装sudo命令再安装模块
#安装sudo命令
apt-get update
apt-get install sudo
#安装缺失模块
sudo apt-get install libbz2-dev #解决 _bz2 模块缺失问题
sudo apt-get install libncurses5-dev libncursesw5-dev #解决 _curses 模块缺失问题
sudo apt-get install libreadline-dev #解决 readline 模块缺失问题
sudo apt-get install libsqlite3-dev #解决 _sqlite3 模块缺失问题
sudo apt-get install liblzma-dev #解决 _lzma 模块缺失问题
#重新安装python
pyenv uninstall 3.10.4
pyenv install 3.10.4 #等了六七分钟,安装时cpu利用率飙升到99.54%,内存升到1020M,安装完成恢复正常
#设置全局的Python版本
pyenv global 3.10.4
#查看版本
python -V
Python 3.10.4
安装截图
开始安装缺失模块
卸载重装
以上操作完成后关闭并重新打开项目,match仍旧报错,检查项目
发现环境依赖还是3.9
此时再次查看版本号,发现环境变成了3.9,没头绪,莫名其妙,删了这个项目然后重建
删除掉所有项目,然后从Inscode新建一个项目
git clone https://gitee.com/chenshuchuan/pyenv.git ~/.pyenv
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec "$SHELL"
#使用pyenv安装Python
pyenv install 3.10.4 #有点慢,然后有警告,缺少几个模块
#使用sudo命令安装缺少模块,首先安装sudo命令再安装模块
#安装sudo命令
apt-get update
apt-get install sudo
#安装缺失模块
sudo apt-get install libbz2-dev #解决 _bz2 模块缺失问题
sudo apt-get install libncurses5-dev libncursesw5-dev #解决 _curses 模块缺失问题
sudo apt-get install libreadline-dev #解决 readline 模块缺失问题
sudo apt-get install libsqlite3-dev #解决 _sqlite3 模块缺失问题
sudo apt-get install liblzma-dev #解决 _lzma 模块缺失问题
#重新安装python
pyenv uninstall 3.10.4
pyenv install 3.10.4
#设置全局的Python版本
pyenv global 3.10.4
#创建虚拟环境
python3.10 -m venv venv
#激活
cd venv/
source bin/activate
然后关掉项目,重新打开,还是这个问题……
# 打开终端
python3.10
subject = "Hello, world!"
match subject:
case "Hello, world!":
print("Exact match!")
case "Hello, ":
print(f"Matched prefix and captured!")
case _:
print("No match found.")
终端正常运行,编译器里提示错误,而且输入mat没有match的匹配项,其它关键字正常,很明显的编译器配置有问题,不挣扎了,过。
二、定义函数
#main.py
def f(a, L=[]):
L.append(a)
return L
if __name__ == '__main__':
print(f(1))
print(f(2))
print(f(3))
#终端输出
#默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果。
[1]
[1, 2]
[1, 2, 3]
#若不想共享默认值
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
#为参数指定默认值是非常有用的方式。调用函数时,可以使用比定义时更少的参数
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
reply = input(prompt)
if reply in {'y', 'ye', 'yes'}:
return True
if reply in {'n', 'no', 'nop', 'nope'}:
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
if __name__ == '__main__':
ask_ok('Do you really want to quit?')
ask_ok('OK to overwrite the file?', 2)
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
#输出
Do you really want to quit?y
OK to overwrite the file?n
OK to overwrite the file?l
Come on, only yes or no!
OK to overwrite the file?no