【python】每天一个小练习

举报
野猪佩奇996 发表于 2022/01/23 01:13:57 2022/01/23
【摘要】 文章目录 注意规范 一、基础操作题二、面向对象OOP三、算法题第一题第二题第三题 注意规范 (1)加上文件头 #!/usr/bin/python ## -*- codin...

注意规范

(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 11666
男员工:
姓名:andy  年龄: 11  性别: 男  工号: 666
请输入个人信息:luo 22007
男员工:
姓名:luo   年龄: 22  性别: 男  工号: 007
-----------------
所有的员工信息如下:
姓名:andy  11666
姓名:luo   22007

  
 
  • 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。