【Python】基础习题100例(51-75例)_努力做最通俗易懂版本

前言:

Python 100个小测试,用于熟悉和巩固Python基础
例题地址:https://www.runoob.com/python/python-100-examples.html


"""
题目51:学习使用按位与&。
""" 
按位与: &  双目运算符.其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位都为1,结果位才为1.参与运算的两个数均以补码出现.
按位或: |  双目运算符.只有对应的两个二进位都为1,结果位才为1
按位异或:  如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
取反 : ~  在补码表示中,最高位为符号位,正数的符号位为0,负数为1
右移 : >>
左移 : << 

分析: 0&0=0; 0&1=0; 1&0=0; 1&1=1"""
题目52:学习使用按位或 | 。
""" 
分析: 0|0=0; 0|1=1; 1|0=1; 1|1=1

"""
题目53:学习使用按位异或 ^ 。
""" 
分析: 0^0=0; 0^1=1; 1^0=1; 1^1=0

"""
题目54:取一个整数a从右端开始的4〜7位。
""" 
分析: 
首先这个整数得满足>=7位,然后取右端开始的4-7, 考核截取字符串; 

num = input("输入整数: ")
num = list(num)[-7:-3]

举一反三: 
str = '0123456789'
print(str[:])        # 截取字符串的全部字符
print(str[0:3])      # 截取第1位到第3位的字符
print(str[6:])       # 截取第7个字符到结尾
print(str[:-3])      # 截取从头开始到倒数第3个字符之前
print(str[2])        # 截取第3个字符
print(str[-1])       # 截取倒数第1个字符
print(str[::-1])     # 创造1个与原字符串顺序相反的字符串
print(str[-3:-1])    # 截取倒数第3位到倒数第1位之前的字符
print(str[-3:])      # 截取倒数第3位到结尾
print(str[:-5:-2])   # 逆序截取==> 先截取,再进行逆序.
value: 
012
0123456789
6789
0123456
2
9
9876543210
78
789
96 

逆袭截取解释: 
str = 'abcdefghijklmn'
位置编号: 012345678910111213
对应编号: -14-13-12-11-10-9-8-7-6-5-4-3-2-1


# 官方方法
分析: 
(1)先使a右移4位。
(2)设置一个低4位全为1,其余全为0的数。可用~(~0<<4)
(3)将上面二者进行&运算。
a = int(input('输入一个数字: '))
b = 0        #     0
b = ~b       #     1
b = b<<4     # 10000
b = ~b       #  1111
c = a>>4
d = c&b
print('a:',bin(a))
print('b:',bin(b))
print('c:',bin(c))
print('d:',bin(d))


"""
题目55:学习使用按位取反~。
""" 
二进制数在内存中以补码的形式存储。
按位取反:二进制每一位取反,0110。
最高位为符号位,正数的符号位为 0,负数为 1。
对正数来说,最高位为 0,其余各位代表数值本身(以二进制表示),如 +42 的补码为 00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加 1,即得该数的补码。如 -42 的补码为 11010110(00101010 按位取反
11010101+111010110)~9 的计算步骤:
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110
转为源码: 
按位取反:1 1001  
末位加 11 1010
符号位为 1 是负数,即 -10

a = 7
b = ~a   # -8
c = -7
d = ~c   # 6 
print ('变量 a 取反结果为: %d' % b)
print ('变量 c 取反结果为: %d' % d)

"""
题目56:画图,学用circle画圆形。  
""" 
分析: 主要为turtle包的使用 
import turtle
turtle.title("画圆")
turtle.setup(800,600,0,0)
pen=turtle.Turtle()
pen.color("yellow")
pen.width(5)
pen.shape("turtle")
pen.speed(1)
pen.circle(100)

"""
题目57:画图,学用line画直线。
""" 
分析: 主要为turtle包的使用 
import turtle
def drawline(n):
    t=turtle.Pen()
    t.color(0.3,0.8,0.6)  #设置颜色,在0--1之间
    t.begin_fill()   #开始填充颜色
    for i in range(n): #任意边形
        t.forward(50)
        t.left(360/n)
    t.end_fill()    #结束填充颜色
drawline(4)

"""
题目58:画图,学用rectangle画方形。   
""" 
分析: 考察tkinter包的使用
from tkinter import *
root = Tk()
root.title('Canvas')
canvas = Canvas(root,width = 400,height = 400,bg = 'yellow')
x0 = 263
y0 = 263
y1 = 275
x1 = 275
for i in range(19):
    canvas.create_rectangle(x0,y0,x1,y1)
    x0 -= 5
    y0 -= 5
    x1 += 5
    y1 += 5
canvas.pack()
root.mainloop()

"""
题目59:画图,综合例子。  
""" 
分析: 考察tkinter包的使用
if __name__  == '__main__':
    from Tkinter import *
    canvas = Canvas(width = 300,height = 300,bg = 'green')
    canvas.pack(expand = YES,fill = BOTH)
    x0 = 150
    y0 = 100
    canvas.create_oval(x0 - 10,y0 - 10,x0 + 10,y0 + 10)
    canvas.create_oval(x0 - 20,y0 - 20,x0 + 20,y0 + 20)
    canvas.create_oval(x0 - 50,y0 - 50,x0 + 50,y0 + 50)
    import math
    B = 0.809
    for i in range(16):
        a = 2 * math.pi / 16 * i
        x = math.ceil(x0 + 48 * math.cos(a))
        y = math.ceil(y0 + 48 * math.sin(a) * B)
        canvas.create_line(x0,y0,x,y,fill = 'red')
    canvas.create_oval(x0 - 60,y0 - 60,x0 + 60,y0 + 60)
    
    for k in range(501):
        for i in range(17):
            a = (2 * math.pi / 16) * i + (2 * math.pi / 180) * k
            x = math.ceil(x0 + 48 * math.cos(a))
            y = math.ceil(y0 + 48 + math.sin(a) * B)
            canvas.create_line(x0,y0,x,y,fill = 'red')
        for j in range(51):
            a = (2 * math.pi / 16) * i + (2* math.pi / 180) * k - 1
            x = math.ceil(x0 + 48 * math.cos(a))
            y = math.ceil(y0 + 48 * math.sin(a) * B)
            canvas.create_line(x0,y0,x,y,fill = 'red')
    mainloop()

"""
题目60:计算字符串长度。  
""" 
str = 'abc'
print(len(str))

"""
题目61:打印出杨辉三角形(要求打印出10行如下图)。  
""" 
分析: 首先要理解什么是杨辉三角,这是非常经典的一个题目; 
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 
1 8 28 56 70 56 28 8 1 
杨辉三角的特性: 
1.第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
2.每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。
  即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即 C(n+1,i)=C(n,i)+C(n,i-1)def triangles():
    L = [1]
    while True:
        yield L
        L = [sum(i) for i in zip([0]+L, L+[0])]

def triangles(num = 10):
    LL = [[1]]
    for i in range(1,num):
        LL.append([(0 if j== 0 else LL[i-1][j-1])+ (0 if j ==len(LL[i-1]) else LL[i-1][j]) for j in range(i+1)])
    return LL


"""
题目62:查找字符串。   
""" 
分析: 基础运用 
str_1 = 'abcdefg'
str_2 = 'cde'
print(str_1.find(str_2))


"""
题目63:画椭圆。 
""" 
分析: 考察tkinter包的使用
if __name__ == '__main__':
    from Tkinter import *
    x = 360
    y = 160
    top = y - 30
    bottom = y - 30
    
    canvas = Canvas(width = 400,height = 600,bg = 'white')
    for i in range(20):
        canvas.create_oval(250 - top,250 - bottom,250 + top,250 + bottom)
        top -= 5
        bottom += 5
    canvas.pack()
    mainloop()

"""
题目64:利用ellipse 和 rectangle 画图。。 
""" 
if __name__ == '__main__':
    from Tkinter import *
    canvas = Canvas(width = 400,height = 600,bg = 'white')
    left = 20
    right = 50
    top = 50
    num = 15
    for i in range(num):
        canvas.create_oval(250 - right,250 - left,250 + right,250 + left)
        canvas.create_oval(250 - 20,250 - top,250 + 20,250 + top)
        canvas.create_rectangle(20 - 2 * i,20 - 2 * i,10 * (i + 2),10 * ( i + 2))
        right += 5
        left += 5
        top += 10

    canvas.pack()
    mainloop()

"""
题目65:一个最优美的图案。   
""" 
import math
class PTS:
    def __init__(self):
        self.x = 0
        self.y = 0
points = []

def LineToDemo():
    from Tkinter import *
    screenx = 400
    screeny = 400
    canvas = Canvas(width = screenx,height = screeny,bg = 'white')

    AspectRatio = 0.85
    MAXPTS = 15
    h = screeny
    w = screenx
    xcenter = w / 2
    ycenter = h / 2
    radius = (h - 30) / (AspectRatio * 2) - 20
    step = 360 / MAXPTS
    angle = 0.0
    for i in range(MAXPTS):
        rads = angle * math.pi / 180.0
        p = PTS()
        p.x = xcenter + int(math.cos(rads) * radius)
        p.y = ycenter - int(math.sin(rads) * radius * AspectRatio)
        angle += step
        points.append(p)
    canvas.create_oval(xcenter - radius,ycenter - radius,
                       xcenter + radius,ycenter + radius)
    for i in range(MAXPTS):
        for j in range(i,MAXPTS):
            canvas.create_line(points[i].x,points[i].y,points[j].x,points[j].y)

    canvas.pack()
    mainloop()

if __name__ == '__main__':
    LineToDemo()


"""
题目66:输入3个数a,b,c,按大小顺序输出。  
""" 
分析: 也没懂这个题顺序是怎么来的,感觉一堆乱... 
前面太多一样的,这里就不写了.. 

"""
题目67:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
""" 
分析: 利用下标和max,min即可; 

a = [1,3,4,5,6]
for i in range(len(a)):
    if a[i] == max(a):
        a[0],a[i]=a[i],a[0]  # 不可分开写,否则会变成[6, 3, 4, 5, 6] 先后赋值;
    if a[i] == min(a):
        a[len(a)-1],a[i]=a[i],a[len(a)-1]
print(a) 

# 法2 
a = [1,3,4,5,6]
print a
# 最小的放到最后
min = min(a)
a.remove(min)
a.append(min)
# 最大的放到最前面
max = max(a)
a.remove(max)
a.insert(0,max)
print(a)



"""
题目68:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数
""" 
分析: 因为总长度不变,即最后一项变为第一个,最后第二个变为整数第二个
     即a[i] = a[i+m] , a[len(a)-1] = a[i]
逻辑和方法对了,其实就很简单了 
a = [1,2,3,4,5,6,7]    # 测试列表
m = 5                  # 设置向后移动 3 位
for i in range(m):
    a.insert(0, a.pop())  # pop 剔除默认最后一位,insert加入指定位置指定数;
print(a)


"""
题目69:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
""" 
n = [i+1 for i in range(20)]
i = 1 
while len(n) > 1:
    if i % 3 == 0:
        n.pop(0)
    else:
        n.insert(len(n),n.pop(0))   # 同68 考验逻辑
    i += 1
print(n) 


"""
题目70:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
""" 
分析:"""
题目71:编写input()和output()函数输入,输出5个学生的数据记录。
""" 
分析:"""
题目72:创建一个链表。
""" 
l=[ input("please input a number:\n") for i in range(5)]
print(l)

"""
题目73:反向输出一个链表。
""" 
l=[ input("please input a number:\n") for i in range(5)]
l.reverse()
print(l)

"""
题目74:列表排序及连接。
""" 
分析:"""
题目75:放松一下,算一道简单的题目。
""" 
分析:

51-75题如上,大家有什么疑问可以留言讨论。

题外话

希望本文有大家有帮助, 如有错误,欢迎指正。
转载请注明原文链接:
https://blog.csdn.net/weixin_41613094/article/details/122268882

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值