python基础 习题总结

pyenv 编程题目总结(99乘法表 打印菱形与闪电 斐波那契数列 素数 猴子吃桃) 原反补码与异或运算 list列表

定短期目标 未来一年内想达到什么样的水平
网络基础知识 IP TCP OSI HTTP
大公司看重算法 (数据结构 图论)
关系型数据库Sql –> 非关系型数据库NoSQL
WEB开发 前端可视化 JS
技术熟练以后 需要提高语言表达能力
Python怎么学
多写 2万行代码
核心问题 网上帖子找不到答案 需要自己多思考 结合所学知识 用代码实现
少看低水平博客 多查手册
慎用删除
用python3.5以上版本
java python c# 虚拟机语言
虚拟机:中间代码 可跨操作系统,中间代码再转化为机器指令
CPython iPython
PyPy JIT技术 动态优化 编译成本地代码 类似C语言
Jython Python源代码编译成Java字节码 可以跑在java虚拟机上
CentOS6 下python虚拟环境配置
CentOS6下默认为python2.6环境 不可升级 故考虑pyenv,该程序可提供python虚拟环境,方便项目部署和开发,同时不影响系统原有python.
STEP0 :pyenv使用编译方式安装 故需事先配置好编译环境
yum -y install git gcc make patch gdbm-devel openssl-devel sqlite-devel
readline-devel zlib-devel bzip2-devel
STEP1: root用户权限过大 pyenv设置不当会修改系统默认python版本 故创建普通用户登录运行pyenv
useradd python
STEP2: 以python用户登录以后安装pyenv curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
提示:
1.https://github.com/pyenv/pyenv-installer 有安装文档的说明
2.若curl出现 curl: (35) SSL connect error ,是nss版本低的问题,更新它。需配置一个有较新包的yum源
[updates]
name=CentOS-Updates
baseurl=https://mirrors.aliyun.com/centos/6.9/os/x86_64
gpgcheck=0
然后更新nss # yum update nss
STEP3: 将pyenv的bin目录加入环境变量
export PATH=”/home/python/.pyenv/bin:$PATH”
eval “$(pyenv init -)”
eval “$(pyenv virtualenv-init -)”
$ source ~/.bash_profile
STEP4: pyenv使用介绍
列出所有可用版本 $ pyenv install –list
在线安装指定版本 $ pyenv install 3.5.3
提示:
这样安装可能较慢,为提速可选用cache方法。
使用缓存方式安装 : 在~/.pyenv目录下,新建cache目录,放入下载好的待安装版本的文件。
不确定要哪一个文件,把下载的3个文件都放进去。可使用xftp或winscp等工具在windows与linux系统之间互传文件.
[python@centos6 ~]$ ll .pyenv/cache/
total 55204
-rw-rw-r–. 1 python python 20656090 Mar 19 16:08 Python-3.5.3.tar.gz
-rw-rw-r–. 1 python python 15213396 Mar 19 16:08 Python-3.5.3.tar.xz
-rw-rw-r–. 1 python python 20656090 Mar 19 16:08 Python-3.5.3.tgz
随后再运行pyenv install 3.5.3 命令就可以很快执行
版本控制
显示当前的python版本$ pyenv version
显示所有可用的python版本$ pyenv versions
global 全局设置 $ pyenv global 3.5.3 该命令会将系统全局的python指定为353版本. 故不推荐root用户进行全局设置 CentOS6.5系统Python为2.6版本,使用了global就成了3.x,会带来很不好的影响。 此时可使用 pyenv global system将全局python版本改为系统python版本
shell 会话设置 影响只作用于当前会话,退出ssh登录就失效 $ pyenv shell 3.5.3
local 本地设置 在某一目录执行 pyenv local 3.5.3 则从该目录开始向下递归都继承这一设置。
Virtualenv 虚拟环境设置
为什么要使用虚拟环境? 因为刚才使用的Python353环境都是一个公共的空间,如果多个项目使用不同Python版本开发,或者使用不同的Python版本部署运行,或者使用同样的版本开发的但不同项目使
用了不同版本的库,等等这些问题都会带来冲突。最好的解决办法就是每一个项目独立运行自己的
“独立小环境”中。
pyenv virtualenv 3.5.3 mag353 使用python3.5.3版本创建出一个独立的虚拟空间。
$ pyenv versions
* system (set by /home/python/.pyenv/version)
3.5.3
3.5.3/envs/mag353
mag353
可以在版本列表中存在,就和3.5.3是一样的,就是一个版本了。 真实目录在~/.pyenv/versions
/下,以后只要使用这个虚拟版本,包就会按照到这些对应的目录下去,而不是使用3.5.3。
[python@node ~]$ mkdir -p magedu/projects/web
[python@node ~]$ cd magedu/projects/web/
指定magedu/projects/web/目录为ma353虚拟环境 该虚拟环境子目录会继承,父目录则没有
[python@node web]$ pyenv local mag353
(mag353) [python@node web]$ cd ..
[python@node projects]$ cd web/
总结:local与虚拟环境的区别: 后者独立得更彻底. 前者只是版本独立,后者还将软件库独立. 即使是和前者相同版本,后者也可将项目所需的库单独存放. 而不影响这一版本的大环境.
pip 通用配置
pip是python的包管理器 默认连接python官方pypi网站,速度较慢.可指定为阿里云的pypi源:
linux下配置文件为~/.pip/pip.conf
windows下pip的配置文件为~/pip/pip.ini
pip.conf内容如下:
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
安装ipython
ipython 是增强的交互式Python命令行工具
pip命令安装ipython $ pip install ipython
启动ipython $ ipython
安装Jupyter jupyter是基于WEB的交互式笔记本,其中可以非常方便的使用Python。 安装Jupyter,也会安装ipython.
$ pip install jupyter
$ jupyter notebook help
查看帮助命令可看到很多有用选项 如jupyter notebook password
$ jupyter notebook –ip=0.0.0.0 –no-browser
提示:若设置密码以后输入密码无法登录jupyter页面 可将启动jupyter窗口后提示信息里的token值粘贴至web页面
原码 反码 补码 负数的表示
原码:符号位+数值位
最高位为符号位 正数符号位为0 负数符号位为1
如8的原码为0 1000 -7的原码为1 0111
正数的反码和补码均与原码相同
负数的反码为 符号位不变 数值位按位取反
负数的补码为 在负数的反码基础上再加1
数字在计算机中以补码形式存储
+7  符号位0 数值为111
0111
-7 符号位1 数值位111
1111
反码1000
补码1001

假设有一个数~9,计算步骤如下,9=1001

其补码为01001,

对其取反10110,这个数是在内存中存放的,现在需要装换成原码,既先减1,然后取反得

11010,符号位为1是负数,即-10

10^9表示10和9原码对应二进制位进行异或运算
异或运算的法则为:相同得0 不同得1
10    0000 1010
9      0000 1001
异或0000 0011
最后结果为3
10 0000 1010
-9 1000 1001
异或 1000 0011
最后结果为-3
python基础 习题总结
内存管理
引用计数
垃圾回收 Garbage Collection 简称GC 慎用!!!
python基础 习题总结尽量少占用内存 内存占用过大会引起GC 影响程序性能
打印99乘法表
”’
打印99乘法表 需注意多处细节
1 根据左右上下三角分别确定行和列的上下限
2 输出结果可直接使用print函数 或对字符串进行拼接再打印
3 注意print函数的两种分隔符设定print(value, …, sep=’ ‘, end=’\n’,)
4 注意print函数默认为左对齐 若想右对齐 需使用print(‘{:>72}’.format())形式设定左右对齐方式(>表示右对齐)以及最长行占位数(72)
”’
for i in range(1,10):
for j in range(1,i+1):
print(j,’x’,i,’=’,i*j,sep=”,end=’\t’)
print()
print(‘————————————————————————-‘)
for i in range(1,10):
line=”
for j in range(i,10):
line+='{}x{}={:<2}  ‘.format(i,j,i*j)
print(‘{:>72}’.format(line))
print(‘————————————————————————‘)
”’最后一种右对齐不用format 需要更复杂的逻辑判断
1 乘积大于9的末尾空两格 小于等于9的空三格
2 因此每项式子的宽度都是8 为实现右对齐 可在列较少的行事先打印出空格,并关闭print本行的换行功能
至于空格数量 则是(i-1)*8 因为需补空格的数量刚好比行号i少1
3 此题不可眼高手低 需认真判断行列号的范围 并适当调整空格数
”’
for i in range(1,10):
print(‘ ‘*(i-1)*8,sep=’  ‘,end=”)
for j in range(i,10):
product=i*j  #product是乘积的英文
if product>9:
end=’  ‘
else:
end=’   ‘
print(i,’x’,j,’=’,product,sep=”,end=end)
print()
输入若干数字 最后输出最大值或平均值
”’
输入若干数字 最后输出最大值 可用以下代码实现
while True:
s=input(‘>>>’)
if s:
pass
else:
break
注意不要形成s=int(input(‘>>>’))的思维定式 若要求输入若干数字
应采用以上办法 输入为空则停止循环
”’
count=0
sum=0
while True:
s=input(‘>>>’)
if s:
count+=1
sum+=int(s)
print(‘ave is ‘,sum/count)
else:
break
m=int(input(‘>>>’))
while True:
s=input(‘>>>’)
if s:
n=int(s)
if n>m:
m=n
print(‘max is ‘,m)
else:
# print(‘max is ‘,m)
break
打印菱形
”’
     *
   ***
  *****
*******
  *****
   ***
     *
以下为规律分析:
用print函数打印 print为左对齐
故只需考虑 行号L 左侧空白数b 星号数s的数学关系即可
行号L  空白数b 星号数s  循环行号i
  1       3       1        -3
  2       2       3        -2
  3       1       5        -1
  4       0       7         0
  5       1       5         1
  6       2       3         2
  7       3       1         3
规律总结
设总行数为n hn=n//2
i=L-4 故range函数可写为range(-hn,n-hn)
b=abs(i)
s=n-2*b
乘2 除2 最好用位运算<<1 >>1代替
下面倒三角的规律只需做小改动
建议将不同的项目分开写 改变量名很麻烦也很容易出错
 *******
  *****
   ***
    *
   ***
  *****
 *******
  ”’
n=9
hn=n>>1
for i in range(-hn,n-hn):
b=abs(i)
s=n-(b<<1)
print(‘ ‘*b,’*’*s)
nd=7
hnd=nd>>1
for i in range(-hnd,nd-hnd):
  bd=hnd-abs(i)
  sd=nd-(bd<<1)
  print(‘ ‘*bd,’*’*sd)
打印闪电
”’
   *
  **
 ***
*******
   ***
   **
   *
以下为规律分析:
用print函数打印 print为左对齐
故只需考虑 行号L 左侧空白数b 星号数s的数学关系即可
行号L  空白数b 星号数s  循环行号i
  1       3       1        -3
  2       2       2        -2
  3       1       3        -1
  4       0       7         0
  5       3       3         1
  6       3       2         2
  7       3       1         3
规律总结
设总行数为n hn=n//2
i=L-4 故range函数可写为range(-hn,n-hn)
i<0
b=-i
s=n-hn+i
i=0
b=-i
s=n
i>0
b=hn
s=n-hn-i
”’
n=7
hn=n>>1
for i in range(-hn,n-hn):
if i<0:
b=-i
s=n-hn+i
elif i==0:
b=-i
s=n
else:
b=hn
s=n-hn-i
print(‘ ‘*b+’*’*s)
猴子吃桃问题
”’
猴子吃桃问题可用逆向思维(加一再乘二)实现
但应注意循环的次数是9次而不是10次
”’
last=1
for i in range(9):
last=(last+1)<<1
print(last)
100以内的斐波那契数列
a=1
b=1
c=0
print(a,b,sep=’\n’,end=’\n’)
while True:
c=a+b
if c>100:
break
a=b
b=c
print(c)
”’
根据斐波那契数列的定义 下次加和时前两位数各向后推一位
这句话翻译为编程语言就是a=b b=c 需好好体会
”’
斐波那契数列的第101项
# n=int(input(‘nst of fbnq>>>’))
n=101
a=1
b=1
# c=0
if n==1:
print(a)
elif n==2:
print(b)
else:
for i in range(n-2):
c=a+b
a=b
b=c
print(c)
判断质数
a=int(input(‘输入一个数,判断是否为质数’))
if a<2:
print(‘注意,0和1既非素数也非合数’)
elif a==2:
print(a,’是质数’)
else:
for i in range(2,int(a**0.5)+1):
if a%i ==0:
print(a,’不是质数’)
break
else :
print(a,’是质数’)
”’本题两点点评
1 判断质数的核心算法,数n对2到n-1取模,若发现可以整除,直接跳出循环.循环结束后一直没有整除,则是质数.
注意最后的else应放在和if同级的位置 而不是if里面
2 数n对2到n-1取模 其实从2到根号n就够了 因为乘法具有交换律 超过根号n的位置
因为合数一定可以表示成两个数(除了1和它本身)相乘,这两个数必然有一个小于等于它的平方根。只要找到小于或等于的那个因数就行了
”’
10万以内的质数
import datetime
start=datetime.datetime.now()
count=1
for a in range(3,100000,2):#1
if a%10==5 and a>10:#2
continue
for i in range(3,int(a**0.5)+1,2):#3
if a%i ==0:
# print(a,’不是质数’)
break
else :
# print(a,’是质数’)
count+=1
pass
print(count)
end=datetime.datetime.now()
print(end-start)
”’
本题的几点优化方向
1 求质数 可以先舍去所有偶数 可减少一半的任务量
2 对于大于10的数 若个位数是5, 必然是5的倍数 可直接排除
3 数n对2到n-1取模 其实从2到根号n就够了 同时待测数中已无偶数,因此取模的数也不需要偶数
”’
python数据类型
数值型
int 长整型 无大小限制
float 双精度浮点数
complex 虚数单位为j 实部虚部皆为浮点数
bool int的子类 仅有True与False两个实例 对应1和0 可与整数直接运算
数字处理函数
int() 只取整数
无论正负 只取出整数部分 小数部分直接丢弃(Return an integer object constructed from a number or string x.For floating point numbers, this truncates towards zero)
因此无论是3.1还是3.9,int后皆为3
无论是-3.1还是-3.9,int后皆为-3
import math
math.floor()向下取整 math.ceil向上取整
这两个函数取整时不考虑误差 在数轴上,小数两边各有一个整数 floor函数取比该数小的整数(Return the floor of x, the largest integer less than or equal to x),ceil函数则取比该数大的整数(Return the ceiling of x, the smallest integer greater than or equal to x.)
floor与ceil的原意为地板与天花板 可形象地表示这一大小边界
因此无论是3.1还是3.9 floor后皆为3 ceil后皆为4
无论是-3.1还是-3.9 floor后皆为-4 ceil后皆为-3
round() 四舍六入五取偶
无论正负数 以0.5为界 小数部分小于0.5则舍去 大于0.5则整数绝对值进一
等于0.5则取与其最接近的偶数(为减小误差)
因此2.5 按照取偶数的原则 结果是2
1.5 取偶为2 并非一般的四舍五入
-2.5 取偶为-2
// floor division 地板除
对自然除法得到的小数再做int处理 即对小数向下取整
9//2=4 注意9//-2=-5
power(x,y) == x**y
math.aqrt() 平方根
math.pi 圆周率π
math.e 自然常数
进制函数 bin() oct() hex() 返回值为字符串
type() 返回类型,而不是字符串
列表list  链表linked list 队列queue  栈stack
列表 存于连续空间 每个元素有确定的线性增长的地址 表长为n 则索引值为0~n-1 可从中间插入元素 但需向后移位(插入数据较为麻烦) 支持随机查找
链表 不需存于连续空间 由指针指向下一位元素 末位元素指针为空 通过修改指针可方便地插入数据 但不支持随机查找
队列 特殊的线性表 只可队首删除 队尾插入 先进先出
栈 有底无盖的容器 进栈出栈都走栈顶(top) 先进后出
列表list
一列队伍 列表内个体称作元素 元素可为任意数据类型(数字 字符串 对象 列表)
元素有序,可用索引 线性结构 用[]表示 可变的
列表的各种操作
初始化: lista=[1,’2′,3.4,5+7j,True] 或 lst = list(range(5))
方法:
尾部追加 append(obj) O(1)
指定索引位置插入 insert(index,obj) O(n)
extend(iteratable) 将可迭代对象的元素追加进来,返回None 就地修改
+ 加号两边跟上列表 两个列表连接起来产生新的列表,原列表不变
lista*n 将列表lista元素重复n次,返回新的列表,原列表不变
remove(value) -> None 从左至右查找第一个匹配value的值,移除该元素,返回None
pop([index]) -> item 不指定索引index,就从列表尾部弹出一个元素 指定索引index,就从索引处弹出一个元素,索引超界抛出IndexError错误
clear() -> None 清除列表所有元素,剩下一个空列表
list[index] = value 通过赋值的方式该元素值
reverse() -> None 将列表元素反转,返回None
sort(key=None, reverse=False) -> None 对列表元素进行排序,就地修改,默认升序 reverse为True,反转,降序
lista[index] 使用索引可直接访问 注意索引范围 0~n-1  -1~-n为负索引,表示倒数第一至倒数第n
index(value,[start,[stop]])通过值value,从指定区间([start,[stop]为前闭后开区间)查找列表内的元素是否匹配 匹配第一个就立即返回 索引匹配不到,抛出异常ValueError
count(value) 返回列表中匹配value的次数
len() 返回列表长度

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/92882

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code