(python版)创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D 依次类推

2023-01-10 10:19:29

1. 代码实现

1.1 使用多线程实现

import threading
import time

def f1():
	"""
	执行f1的时候需要锁住lock1,因此此前lock1必须处于已解锁状态,否则阻塞
	只有当执行完毕一次f1之后,才能解锁lock2,f2才能继续执行
	"""
    for i in range(1, 52, 2):
    	# 锁住lock1,如果此时lock1不是处于未上锁状态,则等待lock1解锁之后才能往下进行
        lock1.acquire()
        print(i, end='')
        print(i+1, end='')
        # 解锁lock2
        lock2.release()

def f2():
	"""
	执行f2的时候需要锁住lock2,因此此前lock2必须处于已解锁状态,否则阻塞
	只有当执行完毕一次f2之后,才能解锁lock1,f1才能继续执行
	"""
    for i in range(26):
    	# 锁住lock2,如果此时lock2不是处于未上锁状态,则等待lock2解锁之后才能往下进行
        lock2.acquire()
        print(chr(i+ord('A')))
        lock1.release()

if __name__ == '__main__':
	# 建立两个线程锁
	lock1 = threading.Lock()
	lock2 = threading.Lock()
	# 创建两个线程
	f1_thread = threading.Thread(target=f1)
	f2_thread = threading.Thread(target=f2)
	# 先锁住lock2,也就是先不让f2执行
	lock2.acquire()
	# 当f1执行1次之后,lock2才会解锁f2才能执行
	f1_thread.start()
	f2_thread.start()

# 输出
12A
34B
56C
78D
910E
1112F
1314G
1516H
1718I
1920J
2122K
2324L
2526M
2728N
2930O
3132P
3334Q
3536R
3738S
3940T
4142U
4344V
4546W
4748X
4950Y
5152Z

1.2 简单实现

有同学可能会发现,其实也可以不用多线程。

def print12A():
    for i in range(26):
        print(2*i + 1, end='')
        print(2*(i+1), end='')
        print(chr(i+65))
        
print12A()

当然,这样写的话,其实没太大意义,因为违背了面试官的初衷。不过能够发现这个规律,也说明洞察能力不错┗|`O′|┛ 嗷~~。

2. 总结

本题主要考察就是线程锁的问题。

另外简单介绍下chr()函数:

用一个范围在 0 到 1,114,111(16 进制表示是 0x10FFFF)的整数作参数,返回 Unicode 码位为整数 i 的字符的字符串格式。
语法

chr(i)
i – 可以是10进制也可以是16进制的形式的数字。
返回值是当前整数对应的Unicode 码位的字符。

示例:

>>>print(chr(0x30), chr(0x31), chr(0x61))   # 十六进制
0 1 a
>>> print(chr(48), chr(49), chr(97))         # 十进制
0 1 a

ord()函数:

ord()函数是chr()函数的逆向。
对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数。例如 ord(‘a’) 返回整数 97, ord(‘€’) (欧元符号)返回 8364 。这是 chr() 的逆函数。

返回值是对应的十进制整数。

示例:

>>>ord('a')
97
>>> ord('b')
98
>>> ord('c')
99
  • 作者:Idea King
  • 原文链接:https://blog.csdn.net/besmarterbestronger/article/details/97616789
    更新时间:2023-01-10 10:19:29