Python常用数据结构-练习题

目录

1、在屏幕上显示跑马灯文字

2、设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成

3、设计一个函数返回给定文件名的后缀名

4、设计一个函数返回传入的列表中最大和第二大的元素的值

5、计算指定的年月日是这一年的第几天

6、打印杨辉三角

7、双色球选号

8、约瑟夫环问题(需详细搞清楚)

9、井字棋游戏(未解决)


1、在屏幕上显示跑马灯文字

import os
import time

# 在屏幕上显示跑马灯文字
def main():
	content = '北京欢迎你...'
	while True:
		os.system('clsq')
		print(content)
		time.sleep(0.2)
		content = content[1:] + content[0] # 此语句每次将第一个字符放在了最后,从而实现跑马灯效果!!!

if __name__ == '__main__':
    main()

2、设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成

import random
def main():
	print(generate_code(4))

def generate_code(code_len = 4):
	"""
	生成指定长度的验证码.
	
	:param code_len: 验证码的长度(默认4个字符)	
	:return: 由大小写英文字母和数字构成的随机验证码
	"""
	
	all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
	last_pos = len(all_chars) - 1
	code = ''
	for _ in range(code_len): # 循环code_len次,产生一个code_len长度的验证码
		index = random.randint(0, last_pos) # 索引根据all_chars字符串产生
		code += all_chars[index] # 每个验证码都由all_chars字符串的index得到
		# 上面code字符串每次做+运算,即每次在后面添加/拼接一个字母,从而得到一个完整的验证码
	return code	

if __name__ == '__main__':
    main()

3、设计一个函数返回给定文件名的后缀名

import random
def main():
	print(get_suffix('abc.exe'))

def get_suffix(filename, has_dot = False):
    """
    获取文件名的后缀名

    :param filename: 文件名
    :param has_dot: 返回的后缀名是否需要带点
    :return: 文件的后缀名
    """	
    
    pos = filename.rfind('.') # 从右到左查找字符串中出现的第一个指定字符,但返回其从左往右、从0数起的下标。
    if 0 < pos < len(filename) - 1: # 如果指定字符不存在,则返回-1
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''

if __name__ == '__main__':
    main()

4、设计一个函数返回传入的列表中最大和第二大的元素的值

import random
def main():
	# print(max2([1, 3, 5, 7, 100]))  # m1,m2默认以元组形式输出

	l = [1, 3, 5, 7, 100]
	t = tuple(max2(l)) # 返回值类型转换为元组型
	l1 = list(max2(l)) # 返回值类型转换为列表型
	s = set(max2(l))   # 返回值类型转换为集合型
	print(t)
	print(l1)
	print(s)

def max2(x):
    """
    返回传入的列表中最大和第二大的元素的值
    :param x: 列表
    :return: 返回列表中的两个最大值
    """
    
    m1, m2 = (x[0], x[1]) if  x[0] > x[1] else (x[1], x[0]) # m1 > m2
    for index in range(2, len(x)):
        if x[index] > m1:    
             m2 = m1
             m1 = x[index]
        elif x[index] > m2:
         	m2 = x[index]
    return m1, m2  

if __name__ == '__main__':
    main()

5、计算指定的年月日是这一年的第几天

  • Python实现
def is_leap_year(year):
    """
    判断指定的年份是不是闰年

    :param year: 年份
    :return: 闰年返回True平年返回False
    """

    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0


def which_day(year, month, date):
    """
    计算传入的日期是这一年的第几天

    :param year: 年
    :param month: 月
    :param date: 日
    :return: 第几天
    """
    days_of_month = [ # 列表
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],  # 平年
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]   # 闰年
    ][is_leap_year(year)] # 不是闰年时,得到False,强转为0;否则,强转为1

#   print(days_of_month)  # 验证days_of_month是哪个列表

    total = 0
    for index in range(month - 1): # index: 0 ~ month - 1
        total += days_of_month[index]
    return total + date


def main():
    print(which_day(1980, 11, 28))
    print(which_day(1981, 12, 31))
    print(which_day(2018, 1, 1))
    print(which_day(2016, 3, 1))	


if __name__ == '__main__':
	main()
  • C实现
#include <stdio.h>

int sum_day(int month, int day);
int leap(int year);

int main()
{
	int year, month, day, days;
 	printf("input date(year,month,day):");
 	scanf("%d,%d,%d", &year, &month, &day);
 	printf("%d/%d/%d ", year, month, day);
 	days = sum_day(month, day);              /* 调用函数sum_day : 按不为闰年的情况算出day。*/
 	if (leap(year) && month >= 3)            /* 调用函数leap : 若为闰年,则leap函数返回0,此if不执行。*/
   		days = days + 1;
 	printf("is the %dth day in this year.\n", days);
 	return 0;
}

int sum_day(int month, int day)    /* 函数sum_day:计算日期 */
{
	int day_tab[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   	int i;                  
   	for (i = 1; i < month; i++)
      	day += day_tab[i];        /* 累加所在月之前天数 */
   	return(day);
}  
                       
int leap(int year)                /* 函数leap:判断是否为闰年 */
{
  	return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}

6、打印杨辉三角

  • Python实现
def main():
#    num = int(input('Number of rows: '))  # 不知道如何在控制台输入?需要安装什么插件,但是安装不上啊
    num = 9
    yh = [[]] * num
    for row in range(len(yh)):
        yh[row] = [None] * (row + 1)
        for col in range(len(yh[row])):
            if col == 0 or col == row:
                yh[row][col] = 1
            else:
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print yh[row][col],          # 这个print语法可以使输出后不换行
        print('')


if __name__ == '__main__':
	main()
  • C实现
#include <stdio.h>
#define N  10
int main()
{ 
    int i, j, a[N][N];
    for (i = 0; i < N; i++)
    {
        a[i][i] = 1;
      	a[i][0] = 1;
    }
    for (i = 2; i < N; i++)
        for(j = 1; j <= i - 1; j++)
            a[i][j] = a[i-1][j-1] + a[i-1][j];
    for (i = 0; i < N; i++)
    {
        for(j = 0; j <= i; j++)
            printf("%6d", a[i][j]);
        printf("\n");
    }
    printf("\n");
    return 0;
}

7、双色球选号

from random import randrange, randint, sample


def display(balls):
    """
    输出列表中的双色球号码
    """
    for index, ball in enumerate(balls):
    if index == len(balls) - 1: # 打印最后一个号码(蓝号)时,现在前面输个分隔符‘|’
        print ('|'),
    print('%02d' % ball),
    print('')


def random_select():
    """
    随机选择一组号码
    """
    red_balls = [x for x in range(1, 34)] # red_balls列表:[1, 2, ... , 33]
    selected_balls = [] 				  # 初始化一个空列表
    selected_balls = sample(red_balls, 6) # 从序列red_balls中随机抽取6个元素,并将6个元素以list形式返回
    selected_balls.sort() 				  # 按照ASCII码升序进行排列
    selected_balls.append(randint(1, 16)) # 选取一个蓝号添加在列表最后一项
    return selected_balls


def main():
    n = int(input('机选几注?'))
    for _ in range(n):
    display(random_select())


if __name__ == '__main__':
    main()

8、约瑟夫环问题(需详细搞清楚)

"""
《幸运的基督徒》——
有15个基督徒和15个非基督徒在海上遇险,
为了能让一部分人活下来不得不将其中15个人扔到海里面去。
有个人想了个办法就是大家围成一个圈,
由某个人开始从1报数(报数到9),报到9的人就扔到海里面,
然后其余的、接下来的那个人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。
由于上帝的保佑,15个基督徒都幸免于难。
问:这些人最开始是怎么站的,请指出哪些位置是基督徒哪些位置是非基督徒。
"""

def main():
    persons = [True] * 30 # 创建一个每个元素都是True的列表,代表30个活着的人
    counter, index, number = 0, 0, 0
    # counter:“已死”的总人数
    # index:作为persons的下标,表示某个人
    # number:1 ~ 9报数
    while counter < 15:
        if persons[index]:		# 判断此人有没有“死”,“必须是活人才走下面的程序”
            number += 1
            if number == 9:
                persons[index] = False
                counter += 1
                number = 0
        index += 1
        index %= 30
    for person in persons:
        print('yes' if person else 'no'), # yes表示这个位置是基督教人


if __name__ == '__main__':
    main()

9、井字棋游戏(未解决)

"""
在一个3x3的棋盘上,一个玩家用X做棋子,另一个玩家用O做棋子,
谁先在棋盘上的一行、一列或对角线上画满三个棋子,即可获胜;
如果棋盘下满无人胜出,即为平局。
"""
import os

def print_board(board):
    print(board['TL'] + '|' + board['TM'] + '|' + board['TR'])
    print('-+-+-')
    print(board['ML'] + '|' + board['MM'] + '|' + board['MR'])
    print('-+-+-')
    print(board['BL'] + '|' + board['BM'] + '|' + board['BR'])


def main():
    init_board = {			# 字典
        'TL': '', 'TM': '', 'TR': '',
        'ML': '', 'MM': '', 'MR': '',
        'BL': '', 'BM': '', 'BR': ''
    }
    begin = True
    while begin:
        curr_board = init_board.copy()
        begin = False
        turn = 'x'
        counter = 0
#       os.system('clear')
        print_board(curr_board)
        while counter < 9:
            move = input('轮到%s走棋,请输入位置:' % turn)
            if curr_board[move] == ' ':
                counter += 1
                curr_board[move] = turn
                if turn == 'x':
                    turn = 'o'
                else:
                    turn = 'x'
#           os.system('clear')
            print_board(curr_board)
        choice = input('再玩一局?(yes | no)')
        begin = choice == 'yes'


if __name__ == '__main__':
    main()
发布了53 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jy_z11121/article/details/96874618