Python 100 --- Day 7

目录

引子

字符串   

字符串的运算  

格式化输出 三种方式

列表list

生成式+列表,和生成器  

        元组tuple

集合set

字典dict   

练习


引子

现在计算机还是以数值计算为主,但有些时候我们存储的方式使用文本形式进行存储,因此我们需要了解字符串。

 

字符串   

  • 单引号

  • 双引号

  • 三个双引号

  • 三个单引号

\ 转义字符,后面还可以跟进制 ,如果不希望\表示转义字符 可以在前面加上r

 

字符串的运算  

 

  •    +
  •     *
  •     [:] 切片
  •     in   not in

 

格式化输出 三种方式

举例

  •     print('%d:%d:%d' % (hour, minute, second))

  •     print('{0}:{1}:{2}'.format(hour,minute,second))

  •     print(f'{hour}:{minute}:{second}')

 

列表list
    
    其中遍历列表的方式(三种方式):

  1.     for index in range(len(list))
  2.        print(list[index])
  3.     for elem in list:
  4.         print(elem)
  5.     #使用enumerate()函数来访问列表的下标和对应的数据
  6.     for index, elem in enumerate(list):
  7.         print(index, elem)
  •     list.append()
  •     list.insert()
  •     list.extend()
  •     list.remove()
  •     list.pop()
  •     list.clear()
  •     切片
  •     list.sort()
  •     list.sorted()

 

生成式+列表,和生成器  

    具体例子:

  • f = [x for x in range(1, 10)

  • g = [x + y for x in 'ABCDE' for y in '1234567'】

  • 生成器的关键字yield

 

元组tuple

大部分和列表类似,但是一点重要的区别,元组不能够修改,因此在一些不能修改的地方就需要使用。元组在创建时间和占用空间上都是优于列表。

 

  集合set

集合中没有重复元素,也就是元素只出现一次

  •     set.add()

  •     set.update()

  •     set.discard()

  •     set.pop()

  •     set.remove()

    两个集合可以做交集,并集,差集等运算

 

字典dict
   

是由key:value组成

 

以上四种数据类型的使用还需要多多练习

 

练习

 

  1. 在屏幕上显示跑马灯文字
  2. 设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。
  3. 设计一个函数返回给定文件名的后缀名。
  4. 设计一个函数返回传入的列表中最大和第二大的元素的值。
  5. 计算指定的年月日是这一年的第几天。
  6. 打印杨辉三角
  7. 双色球选号。
  8. 约瑟夫环问题
  9. 井字棋游戏。

1.

#在屏幕上显示跑马灯文字
import os
import time

def main():

	content = '欢迎学习Python!           '

	while True:
		os.system('cls')  #清除屏幕上的输出
		print(content)
		time.sleep(0.2)  #休眠200毫秒
		#实现跑马灯功能
		content = content[1:] + content[0]

if __name__ == '__main__':
	main()

2.

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

import random

def generate_code(code_len):
	all_chars = '0123456789zbcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
	last_pos = len(all_chars) - 1
	code = ''
	for _ in range(code_len):
		index = random.randint(0, last_pos)
		code += all_chars[index]
	return code
	

if __name__ == '__main__':
	new_code = generate_code(4)
	print(new_code)
	input_code = str(input())
	if new_code.upper() == input_code.upper():
		print('验证码输入正确')
"""

3.

#输出文件的后缀名
def get_suffix(filename, has_pot = False):
	pos = filename.rfind('.')  #找到'.'的位置
	#print(pos)
	if 0 < pos < len(filename) - 1:
		index = pos if has_pot else pos + 1
		return filename[index :]
	else:
		return ''

if __name__ == '__main__':
	print(get_suffix('bb.py'))
	print(get_suffix('aa.c'))
	print(get_suffix('a.html112'))

4.

#函数:返回传入列表中的最大和第二大的元素的值
#其中列表中元素必须多于1个
def max2(x):
	if (len(x) < 2):
		return 'invalid list'
	else:
		m1 ,m2 =(x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
		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__':
	a = [1,4,58,1,245,206,6,7,51,225,2]
	b = [1,0]
	c = [1]
	print(max2(a))
	print(max2(b))
	print(max2(c))

5.

#计算指定的年月日时这一年的第几天
def is_leap(year):
	if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0) :
		return True
	else: 
		return False

def cal_day(year, month , day):
	day_of_month1 = [31,28,31,30,31,30,31,31,30,31,30,31]
	day_of_month2 =	[31,29,31,30,31,30,31,31,30,31,30,31]
	total = 0

	if is_leap(year):
		for index in range(month - 1):
			total += day_of_month2[index]
	else:
		for index in range(month - 1):
			total += day_of_month1[index]

	return total + day

def main():
	print(cal_day(2000,8,6))
	print(cal_day(1852,1,1))
	print(cal_day(1999,8,6))
	print(cal_day(2017,12,31))
	print(cal_day(1000,8,6))

if __name__ == '__main__':
	main()

6.

#输出杨辉三角
def main():
	num = int(input('Number of rows:'))
	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], end='\t')
		print()

if __name__ == '__main__':
	main()	

7.

#双色球自动随机选号
import random

#选择6个红球和1个蓝球
def ball_selected():
	redball = [x for x in range(1,34)]
	selected = []
	#random中内置的sample函数来选择列表中不重复的n个元素
	selected = random.sample(redball, 6)
	selected.sort()
	#选择一个篮球
	selected.append(random.randint(1,17))
	#print(selected)

	return selected

#显示输出的样式
def display(balls):
	#遍历数据对象,返回下标和数据,
	for index, ball in enumerate(balls):
		if index == len(balls) - 1:
			print('||', end=' ')
		print('%02d' % ball, end=' ')
	print()

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


if __name__ == '__main__':
	main()

8.

#约瑟夫环问题
def main():
	#人的状态只有两种情况,留下和离开,所以用ture和false
	persons = [True] * 30
	counter, index, number = 0, 0, 0
	while counter < 15:
		if persons[index]:
			number += 1
			if number == 9:
				persons[index] = False
				counter += 1 
				number =0
		index += 1
		#到29就从0开始数
		index %= 30
		print(index, number, counter)

	for number,person in enumerate(persons):
		print(str(number+1)+'基督教徒' if person else str(number+1)+"非基督教", end = '\t')


if __name__ == '__main__':
	main()

9.

#井字棋游戏
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:
		#使用copy这样不改变原来的棋盘模样
		curr_board = init_board.copy()
		begin = False
		turn = 'x'
		counter = 0
		#清除屏幕
		os.system('cls')
		print_board(curr_board)

		while counter < 9:
			#输入TL,TM,TR,ML,MM,MR,BL,BM,BR,来作为位置信息
			move = input('轮到%s走棋,请输入位置:' % turn)
			if curr_board[move] == ' ':
				counter += 1
				curr_board[move] = turn
				if turn == 'x':
					turn = 'o'
				else:
					turn = 'x'
					
			os.system('cls')
			print_board(curr_board)
			choice = input('在玩一局?(Y | N)')
			begin = choice == 'Y'


if __name__ == '__main__':
	main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值