【python】每天一个小练习
注意规范
(1)加上文件头
#!/usr/bin/python
## -*- coding: utf-8 -*-
- 1
- 2
#!/usr/bin/python指定有什么解释器运行脚本及解释器所在的位置
原因:脚本语言共同遵守的规则:当第一行为 #!/path/to/script/interpreter时,指定了用来执行本脚本的解释器。
例如:
#!/bin/sh shell脚本
#!/usr/bin/perl perl脚本
#!/usr/bin/python python脚本
#!/usr/bin/python2 python2脚本
#!/usr/bin/python3 python3脚本
- 1
- 2
- 3
- 4
- 5
#!/usr/bin/env
会自动搜索脚本解释器的绝对路径
(2)编码规范:运算符前后加1个空格(以对齐为目的可以用tab)、函数参数间的逗号后加1个空格、global声明只能放在函数的开头、设置一个tab键为4个空格
一、基础操作题
1.获取字符串“123456”最后2个字符
strf='123456'
print(str[-2:])
- 1
- 2
2.一个编码为GBK的字符串S,要将其转为UTF-8的字符串
a="啊啊啊" #py3中默认编码是unicode
bytes(a,"gdk")
ans1=a.encode("utf-8")
print(ans1)
- 1
- 2
- 3
- 4
3.Alist[1,2,3,1,2]对列表元素去重
list=[1,3,4,1,2]
s1.set(list)
print s1
- 1
- 2
- 3
list[-1]代表最后一个元素;list[a:-1]指向了倒数第二个
4.实现“1,2,3”变成[“1”,“2”,“3”]
str="1,2,3"
ans=str.split(',')
print(ans)
- 1
- 2
- 3
5.合并两个字典a={“A”:1,“B”:2},b={“C”:3,“D”,4}
a={"A":1,"B":2}
b={"C":3,"D":4}
ans=dict(a.items()+b.items())
a.update(b)#用这种方法比较多
print(ans)
print(a)
- 1
- 2
- 3
- 4
- 5
- 6
6.实现tuple和list的转换
alist=[123,'abc']
atuple=tuple(alist)
- 1
- 2
7.把元组(“a”,“b”)和元组(1,2)变成{“a”:1,“b”:2}
a=("a","b")
b=(1,2)
d=dict(zip(a,b))#字典序
- 1
- 2
- 3
8.打乱一个列表的元素
import random
x=[i for i in range(100)]
print(x)
x.random.shuffle()
print(x)
- 1
- 2
- 3
- 4
- 5
9.给定2个list,A和B,找出相同元素和不同元素
a=[i for i in range(1,99,2)]
b=[j for j in range(2,100,2)]#偶数
x=[x in a if x in b]
y=[y in (a+b) if y not in x]#非共有的数
- 1
- 2
- 3
- 4
注意列表解析的用法:
lst1 = [i*2 for i in range(1,11)]
print(lst1)
# 结果为[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
- 1
- 2
- 3
再如:创建一个全部为问号的二维数组(Length行Length列):
lst1 = [['?'] * Length for i in range(Length)]
- 1
10.a="hello"和b="你好"编码成bytes类型
bytes('hello','utf-8')
bytes('您好','gbk')
- 1
- 2
tuple=(1,2,'hi')
print(len(tuple))
list=[100,23,45]
print(list[0])
hello=['hi','hello']
world=['earth','field','universe']
hello.append('你好')
print(hello)
hello.extend(world) #插入列表
print(hello)
hello.insert(0,'我的天啊')
print(hello)
hello.remove('你好')
print(hello)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
11.注意打印的格式
print('The boss named %(name)s is %(age)d-year-old and %(height)g tall.' % boss)
- 1
12.各种队列
队列from queue import Queue(maxsize)
13.输出所有的大写字母和数字
https://www.cnblogs.com/pyse/p/9847812.html
14.input注意
在 Python3.x 中 raw_input() 和 input() 进行了整合,去除了 raw_input( ),仅保留了input( )函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。
15.三引号是可以换行写代码(有时候代码过长,换行会便于理解和阅读)
三引号字符串作为docstring
16.(1)全角用2个标准字符的位置,占2个字节
汉语是全角,注意全角的数字是半角的数字的位置的2倍。
(2)半角用1个标准字符的位置,占1个字节
英文字母、数字和字符都是半角
17.禁止空格和tab键混用,indent是缩进的意思,会报错unindent does not match 啥的
18.避免使用from … import …
如A.py中定义
flag=1
B.py中用了
from A import *
- 1
- 2
- 3
- 4
- 5
如果在某个地方改了A.py的flag值——A.flag=0,这时打印A模块和B模块的a的值则不一样(0,1)
19.变量只是引用对象的名称,不会创建副本。
x=[1,2,3,4]
y=x
y[0]=0
print(x) #[0,2,3,4]
print(y) #[0,2,3,4]
- 1
- 2
- 3
- 4
- 5
20.遍历时删除列表项
num_list=[1,2,3,4,5]
for i in xrange(len(num_list)):
if nym_list[i]==2:
num_list.pop(i)
else:
print num_list[i]
print num_list
- 1
- 2
- 3
- 4
- 5
- 6
- 7
会报错:indexError:list index out of range,可以这么改(多一句):
num_list=[1,2,3,4,5]
for i in xrange(len(num_list)):
if i>- len(num_list):
break
if nym_list[i]==2:
num_list.pop(i)
else:
print num_list[i]
print num_list
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
或者更好的方法:
num_list=[1,2,2,4,5]
num_list=[i for i in num_list if i!=2]
num_list=[]
for i in num_list:
if i!=2:
new_list.append(i)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
21.函数默认参数使用可变类型
def saver(x=[]):
x.append(1)
print(x)
saver([2]) #[2,1]
saver() #[1]
saver() #[1,1]
saver() #[1,1,1]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
正确做法:
def saver(x=None):
if x is None:
x=[]
x.append(1)
print(x)
saver([2]) #[2,1]
saver() #[1]
saver() #[1]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
22.不正确的使用类变量
方法顺序解析MRO
class A(object):
x=1
class B(A):
pass
class C(A):
pass
print A.x,B.x,C.x #1,1,1
B.x=2 print A.x,B.x,C.X #1,2,1
A.x=3 print A.x,B.x,C.x #3,2,3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
23.将字符串数字转为数字型,直接int(str)即可。
24.注意printf是自动带换行的(很容易忘记这点),
另外input默认输入为字符串,如果要用成数字可以用int(str)等进行转换。
如:输入" 0 1 2 3 …Length-1"
ans = [i for i in range(0, Length)]
for j in range(len(ans)+1):
if j == 0:
print(" ",end = " ")
else:
if j == Length:
print("%d"%(j - 1))
else:
print("%d"%(j - 1),end = " ")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
官方文档:format会代替%,所以多用format。
25.创建一个集合:
可以使用大括号 { }
或者 set()
函数创建集合,
注意:创建一个空集合必须用 set()
而不是 { }
,因为 { }
是用来创建一个空字典。
N1 = {1, 'A', 2, 3, 4, 4, 4}
print(N1) # {1, 2, 3, 4, 'A'}
- 1
- 2
26.元组的索引,有一种是两个双引号的,最后数字代表步长:
sentence = '''andyguo happy'''
sentence1 = '''aaaabbbb'''
s1 = sentence[1:6:2] # 步长为2,nyu
s2 = sentence[:] # 所有元素
print(s1)
print(s2)
- 1
- 2
- 3
- 4
- 5
- 6
27.find
用于查找字符串的子串
find(substr, beg=0, end=len(string)):
在[beg, end]范围内查找substring,找到返回substr的起始下标,否则返回 -1。
string = 'Hello Python'
print(string.find('h', 0, len(string))) # 输出 9
print(string.find('thon') # 输出 8
print(strin.find('thon', 9, len(string)) # 输出 -1
- 1
- 2
- 3
- 4
28.可以通过setdefault()
对空字典进行赋值:
# 字典赋值:setdefault()
d=dict() #产生空字典
D={} #产生空字典
d.setdefault('a',0)
D.setdefault('b',[1,2,3,4,5])
print(d)
print(D)
# {'a': 0}
# {'b': [1, 2, 3, 4, 5]}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
二、面向对象OOP
(1)类的成员函数参数第一个记得加上self
,类中的成员变量记得前面加上self.
(2)如果父类有子类则记得有(object)
,如果没有子类则括号都没;
(3)主函数开头记得有if __name__ == '__main__':
(4)尽量少使用全局变量,如果要用则简单是写在同个项目的另一个文件(如文件名为globalvar)中,在主程序开头记得import globalvar as gl
,也可以不写gl用其他名;
(5)除非从事底层开发,否则很少使用继承(子类重写方法后有错不好查)
类的4种关系:继承、实例化、组合、认识
(6)
三、算法题
第一题
编写一个类Cpeople(人的姓名str、年龄str、性别bool、工号int),依次从键盘或文件上输入每个人的如上信息。遍历输出所有男性员工信息;按年龄为序输出所有员工,同年龄则以工号升序为序
存储Cpeople类对象的数据结构用list或dict
注意:输出要列对齐
#!/usr/bin/python2
## -*- coding: utf-8 -*-
import functools
import re
class CPerson:
def __init__(self,name,age,sex,number):
self.name=name
self.age=age
self.sex=sex
self.number=number
def MyCmp(self,other):
if self.age>other.age:
return 1
elif self.age==other.age:
if self.number<other.number:
return 1
else:
return -1
else:
return -1
lst1=[]
n=int(input('请输入人数:'))
for k in range(n):
name,age,sex,number=map(str,input("请输入个人信息:").split())#分开input则是以回车换行
i=CPerson(name,age,sex,number)
if i.sex=='男':
print("男员工:")
print('姓名:%-5s'%i.name,'年龄:',i.age,' 性别:',i.sex,' 工号:',i.number)
#注意名字要实现列对齐
lst1.append(i)
lst1.sort(key=functools.cmp_to_key(MyCmp))
#输出数据
print("-----------------")
print("所有的员工信息如下:")
for i in range(n):
print("姓名:%-5s"%lst1[i].name,lst1[i].age,lst1[i].sex,lst1[i].number)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
结果为:
请输入人数:2
请输入个人信息:andy 11 男 666
男员工:
姓名:andy 年龄: 11 性别: 男 工号: 666
请输入个人信息:luo 22 男 007
男员工:
姓名:luo 年龄: 22 性别: 男 工号: 007
-----------------
所有的员工信息如下:
姓名:andy 11 男 666
姓名:luo 22 男 007
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
第二题
加密四位整数,规则如下:每位数字加5,用和除以10的余数代替该位的数字,再将第一位和第四位交换,第二位和第三位交换
#!/usr/bin/python
## -*- coding: utf-8 -*-
def encode(a):
c = []
for i in range(4):
c.append(int(a[i]))
for j in range(4):
c[j] = (c[j] + 5) % 10
c[0], c[3] = c[3], c[0]
c[1], c[2] = c[2], c[1]
#print(c)
for k in range(4):
print(c[k], end='')
a = input("请输入四位数:")
print("一开始的数字:",a)
#print(type(a))
print("加密后的数字:")
encode(a)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
第三题
在键盘上,左手每隔2秒按下一个子母键盘(依次A-Z),右手每隔5秒按下一个数字键(0-9),模拟求按下第100个键是哪个手,哪个键。
#!/usr/bin/python
## -*- coding: utf-8 -*-
BigZ=[chr(i) for i in range(65, 91)]#大写字母A-Z
Num=[int(i) for i in range(0,9)]#数字0-9
time=0
num1=0
num2=0
flag=0
while(1):
global ans
#每次遍历为1s
flag=flag+1
if(time%2==0):
num1=num1+1
if(flag==100):
ans='left'
break
if(time%5==0):
num2=num2+1
if(flag==100):
ans='right'
break
print(ans)
if(ans=='left'):
a=BigZ[num1%26]
print(a)
if(ans=='right'):
a=Num[num2%10]
print(a)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/116211700
- 点赞
- 收藏
- 关注作者
评论(0)