个人在刚学习python基础做过的一些小练习,包括自己总结的一些经验,分享给大家(每一个demo作者基本上都另辟蹊径,与网上大多数答案都不一样!)

'''
Created on 2020年8月3日
demo1:99乘法表(分析单个算式的规律)
    另一种方法是(从整个表的整体分析):将内部循环改为
    for j in range(1,10):
        if i >= j:
            print("{0}x{1}={2}".format(i,j,i*j),end=" ")

def demo1():
    for i in range(1,10):
        for j in range(1,i+1):
            print("{0}x{1}={2}".format(i,j,i*j),end=" ")
        print()


demo2:使用循环输出等腰三角形

def demo2(n):
    for i in range(0,n):
        print("{: ^50}".format("*"*(1+i*2)))


demo3:给定奇数n,输出横竖斜的总和相等
    a.如果右上角的位置的行和列都越界,就将这个数放在上个数的正下方(即:上个数的行+1)。
    b.如果右上角的位置只有行越界,就将行改到最大,列不变。
    c.如果右上角的位置只有列越界,就将列改到最小,行不变。
    d.如果右上角的位置没有越界,但是已经填有数字,就将这个数放在上个数的正下方。

def demo3():
    n = int(input("请输入一个奇数:"))
    #初始化一个矩阵
    m=[[0 for i in range(n)] for i in range(n)]
    #1总是位于第一行的中间位置
    row, col = 0, n//2
    sum = n*n
    #利用循环往 矩阵里填数
    for i in range(1,sum+1):
        m[row][col]=i
        row -= 1
        col += 1
        if row < 0 and col >=n:
            row, col = row + 2, col - 1
        elif row < 0:
            row = n-1
        elif col >= n:
            col = 0
        elif m[row][col] != 0:
            row, col = row + 2, col - 1
    for i in range(n):
        for j in range(n):
            print("%02d"%m[i][j],end=" ")
        print()  


demo4:给定一个奇数n,打印菱形

import copy      
def demo4():
    n = int(input("请输入一个奇数:"))
    sum = 1
    n1 = n//2
    for i in range(0,n1):
        print("{: ^50}".format("*"*(1+i*2)))
        sum += 2
    sum2 = copy.copy(sum)
    for i in range(0,n1+1):
        print("{: ^50}".format("*"*(sum2-i*2)))


demo5:给定一个奇数n,打印空心菱形
    str_replace()#用来替换每行字符中的“*”

def demo5():
    n = int(input("请输入一个奇数:"))
    sum = 1
    n1 = n//2
    for i in range(0,n1):
        line = "*"*(1+i*2)
        if i > 0:
            line = str_replace(line," ",1,(i-1)*2+1)
        print("{: ^50}".format(line))
        sum += 2
    sum2 = copy.copy(sum)
    for i in range(0,n1+1):
        line = "*"*(sum2-i*2)
        if i < n1:
            line = str_replace(line," ",1,sum2-(i+1)*2)
        print("{: ^50}".format(line))
#按索引批量替换字符串
def str_replace(str,char,start,end):
    string = list(str)
    for i in range(start,end+1):
        string[i] = char
    return "".join(string)

demo6:输入成绩,打印等级
    用元组装等级,然后利用取余对应元组的index

def demo6():
    degree = ("A","B","C","D")
    while True:
        score = int(input("请输入成绩(0-100之间):"))
        if score not in range(101):
            print("成绩不合法")
            return
        else:
            s = score//10
            if s == 10:
                s = 9
            elif s <= 6:
                s = 6
            print("成绩是:{0},等级为:{1}".format(score, degree[9-s]))


demo7:判断101~200之间有多少个素数,并输出所有素数
    在101~200之间的不是合数的就是质数,我们设立一个flag,如果不是合数就输出

def demo7():
    flag = 0
    for i in range(101,201):
        flag = 0
        for j in range(2,int(sqrt(i))+1):
            if i%j == 0:
                flag = 1
                break
        if flag == 0:
            print(i,end=" ")


demo8:打印所有的“水仙花数”
    判断是否为水仙花数(3位数:100~999以内),提取一个3位数的个,十,百位做计算

def demo8():
    for i in range(100,1000):
        h = i//100
        t = (i-h*100)//10
        o = i-h*100-t*10
        if h**3+t**3+o**3 == i:
            print(i,end=" ") 


demo9:统计字符串中字母,空格,数字和其他字符的个数

def demo9():
    str = input("请输入一个字符串:")
    letters = 0
    space = 0
    digit = 0
    other = 0
    for char in tuple(str):
        if char.isalpha():
            letters += 1
        elif char.isspace():
            space += 1
        elif char.isdigit():
            digit += 1
        else:
            other += 1
    print("字母数:{0},空格数:{1},数字数:{2},其他字符数:{3}".format(letters,space,digit,other)) 


demo10:给定半径n,打印近似圆
    利用勾股定理
    利用字符串格式化,三行代码搞定
    demo11:笨办法,将整个过程分为打印:1、圆左边的空格。2、圆左边的点。3、圆中间的空格。4、圆右边的点

def demo10(r):
    #记录上一次循环的x,防止出现多行相同的结果,如果相同就不打印,直接跳过
#     last_x = 0 
    for i in range(0,2*r+1,2):
        x = round(r-sqrt(r**2 - (r-i)**2))
#         if x == last_x :
#             continue
#         last_x = x
        print(("*"+" "*2*(r-x)+"*").center(2*r+2, " "))                 
def demo11(r): 
    for i in range(0,2*r+1,2):
        x = round(r-sqrt(r**2 - (r-i)**2))
        space_len = 2*(r-x)
        for j in range(0,x+1):
            print(" ",end="")
        print("*",end="")
        for k in range(0,space_len+1):
            print(" ",end="")
        print("*")  


demo12:打印指定n大小的字母菱形图
        ------d------
        ----d-c-d----
        --d-c-b-c-d--
        d-c-b-a-b-c-d
        --d-c-b-c-d--
        ----d-c-d----
        ------d------

def demo12(n):
    #中间字符串长度
    mid_len = 4*n - 3
    #行数
    row = 2*n-1
    #第一行的字母为
    fst_char = chr(ord("a")+n-1)  
    print ("第一行字母:{0}".format(fst_char))
    line_list = []
    #第二行,算一次;第三行算两次 (直到第n行)
    for i in range(1,n+1):
        cen_line1 = fst_char
        if i > 1:   
            #计算次数
            count = 1
            #循环构造每行的中间内容
            while count < i:
                cen_line1 = cen_line1+("-{0}".format(chr(ord(fst_char)-count)))
                count +=1
            rev_line = cen_line1[::-1][1:]
            cen_line1 = cen_line1 + rev_line
        print(cen_line1.center(mid_len,"-"))
        if i != n:
            line_list.append(cen_line1)
    #n+1行以后,将上面的cen_line1存起来再遍历打印
    for i in range(len(line_list)):
        print(line_list[len(line_list)-i-1].center(mid_len,"-"))


demo13:模拟计算机底层如何实现二进制数相加
    利用逻辑门逐位操作,掌握两个关键点:
    1、sum -- xor(异或)--和
    2、carry -- and(与)--进位
    尽量避免使用str+str

import io       
def demo13():
    d_str = input("请输入两个二进制数(a,b):")
    a, b = d_str.split(",")
    len_1 = len(a)
    len_2 = len(b)
    #将位数少的二进制高位补零,这里需要用到可变字符串
    io_str1 = io.StringIO("")
    if len_1 != len_2:
        for i in range(abs(len_1-len_2)):
            io_str1.seek(i)
            io_str1.write("0")
        #print(io_str1.getvalue())  
    if len_1 > len_2:
        b = io_str1.getvalue()+b#不好,又创建了一个对象
        #print(b)
    elif len_1 < len_2:
        a = io_str1.getvalue()+a
    result = ""
    #进位并打印结果
    carry = 0
    io_str2 = io.StringIO("")
    for i in range(len(a)-1,-1,-1):
        #就得先判断是否进位
        if carry:#上次进了
            io_str2.seek(i)
            io_str2.write(str(int(a[i]) ^ int(b[i])^1))
            carry = int(a[i]) | int(b[i])
        else:#上次没进
            io_str2.seek(i)
            io_str2.write(str(int(a[i]) ^ int(b[i])))
            carry = int(a[i]) & int(b[i])
        if not i and carry:#解决如果最后一位进位的话,超出原最长二进制数长度无法打印的问题
            result = "1" + io_str2.getvalue()
        else:
            
            result = io_str2.getvalue()       
    print(result)


@author: liyy2023@foxmail.com
'''
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值