第二章:Python变量与数据类型
 一、实验目的:
 1.了解Python变量的概念与相关含义;
 2.学习Python中的数据类型;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
 1.将字符串“Nice To Meet You !”中的大写字母全部改为小写字母。
实验源代码:
str1 = "Nice To Meet You !"
str2 = "WWW.jrcg.com"
print(str1)
print("转换后:",str1.lower())
print(str2)
print("转换后:",str2.lower())
 
实验结果:
 
2.找出字符串“nice to meet you !”中t 的个数和位置。
实验源代码:
def get_1_pos(string):
    onePos = []
    try:
        onePos = list(((pos, int(val)) for pos, val in enumerate(string) if val == 't'))
    except:
        pass
    return onePos
def get_1_num(string):
    return len(list(get_1_pos(string)))
def get_char_pos(string, char):
    chPos = []
    try:
        chPos = list(((pos, char) for pos, val in enumerate(string) if (val == char)))
    except:
        pass
    return chPos
def get_char_num(string, char):
    return len(list(get_char_pos(string, char)))
if (__name__ == "__main__"):
    str0 = "10101010101010101"
    str1 = "nice to meet you !"
    lt = get_1_pos(str0)
    print(lt)
    lt = get_1_pos(str1)
    print(lt)
    num = get_1_num(str0)
    print(num)
    lt = get_char_pos(str1, 't')
    print(lt)
    num = get_char_num(str1, 't')
    print(num)
 
实验结果:
 
3.用random.randint()函数生成100个[1,100]的随机整数,去掉重复的元素,然后从小到大排序并输出。
实验源代码:
import random
NumList=[]
new_num_list=[]
for i in range(100):#生成100个随机数
    NumList.append(random.randint(1,100))
for i in NumList:#列表去重
    if i not in new_num_list:
        new_num_list.append(i)
new_num_list.sort()#从小到达排序
print(new_num_list)
 
实验结果:
 
4.请用户输入月份,然后返回该月份属于哪个季节。
实验源代码:
print("-------月份判断开始-------")
spring = [3,4,5]
summer = [6,7,8]
fall = [9,10,11]
winter = [12,1,2]
month = int(input("请输入月份判断该月季节:"))
if month in spring:
    print("{}月,为春季,春暖花开!".format(month))
elif month in summer:
    print("{}月,为夏季,夏日炎炎!".format(month))
elif month in fall:
    print("{}月,为秋季,秋高气爽!".format(month))
elif month in winter:
    print("{}月,为冬季,银装素裹!".format(month))
else :
    print("输入的月份有误")
 
实验结果:
 
第三章:Python流程控制语句
 一、实验目的:
 1.了解Python流程控制语句;
 2.学习列表推导式;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
 三、实验内容:
 1.显示斐波那契数列
实验源代码:
# 斐波那契数列
nterms = int(input("你需要几项?"))
# 第一和第二项
n1 = 0
n2 = 1
count = 2
# 判断输入的值是否合法
if nterms <= 0:
    print("请输入一个正整数。")
elif nterms == 1:
    print("斐波那契数列:")
    print(n1)
else:
    print("斐波那契数列:")
    print(n1, ",", n2, end=" , ")
    while count < nterms:
        nth = n1 + n2
        print(nth, end=" , ")
        # 更新值
        n1 = n2
        n2 = nth
        count += 1
 
实验结果:
 
2.找出100以内能被3或7整除的,但不能同时被3和7整除的自然数。
实验源代码:
num = 1
count = 0
# 循环条件
while num < 100:
    # 循环体,设置条件
    # 补全代码
    if (num % 3 == 0 or num % 7 == 0) and num % 21 != 0:
        count = count + 1
    num = num + 1
print(count)
 
实验结果:
 
3.输出九九乘法表。
实验源代码:
for i in range(1,10):
    for j in range(1,i+1):
        a=i*j
        """把待输出的结果按要求格式保存成字符串"""
        string=str(j)+'x'+str(i)+'=' +str(a) +'\t'
        """把字符串打印到屏幕上,但不输出换行符"""
        print(string,end='')
    """换行"""
print('')
 
实验结果:
 
 4.给定一个正整数rows,生成rows行杨辉三角。
实验源代码:
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()
 
实验结果:
 
第四章:函数、模块和包
 一、实验目的:
 1.了解Python模块化概念与相关含义;
 2.学习Python模块化技术及其标准模块;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
 1.定义一个名为add_two_numbers的函数,有两个参数:a和b,计算并返回a和b的和。
 实验源代码:
def add_two_numbers(a,b):
     sum=a+b
     return sum
c=add_two_numbers(a=4,b=5)
print(f'the sum of 4 and 5 is {c}')
 
实验结果:
 
2.Python解释器根据变量定义的位置判断变量是全局变量还是局部变量。
 实验源代码:
x=10
def outer():
    x=20
    def inner():
        x=30
        print("From inner():x{0:d}".format(x))
    inner()
    print("From outer():x={0:d}".format(x))
outer()
print("From module:x={0:d}".format(x))
 
实验结果:
 
3.创建名为calculator的模块范例,里面包括语句,函数和类。
 实验源代码:
print("hello from caculator.py!")
def add(a,b):
    return a+b
class striangle:
    
     pass
 
实验结果:
 
4.用calendar模块实现闰年检测。
实验源代码:
from calendar import isleap
y = int(input("请输入要判断的年份:"))
if isleap(y):
    print("是闰年")
else:
    print("不是闰年")
 
实验结果:
 
第五章:文件与目录操作
 一、实验目的:
 1.了解Python中的文件操作;
 2.学习Python中的目录操作以及路径操作;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
1.打开“write_example.txt”文件后,依次实现读取全部字符,读取三个字符,读取一行,读取三行,读取所有行。
 实验源代码:
fo=open('D:\Download\write_example.txt','r',encoding='utf-8')
fo.read()
fo.seek(0)
fo.read(3)
fo.tell()
fo.seek(0)
fo.readline()
length=len('line\n'.strip())
fo.readlines(length*3)
fo.seek(0)
fo.readlines()
 
实验结果:
 
2:新建一个“write_example.txt”然后依次写入‘123456’,‘hello,world!’‘line1\n’,‘line2\n’,‘line3\n’
 实验源代码:
fow= open ('D:\Download\write_example.txt','w',encoding='utf-8')
fow.write('123456')
fow.write('hello,world!\n')
fow.writelines(['line1\n','line2\n','line3\n'])
fow.close()
 
实验结果:
 
3:用with语句打开“write_example.txt”文件并读取全部行。
 实验源代码:
with open ('D:\Download\write_example.txt','r',encoding='utf-8') as fo:
    for line in fo.readlines():
        print(line,end='')
fo.closed()
True
 
实验结果:
 
4:关闭文件对象的close()方法实现。
 实验源代码:
fo=open('D:\Download\write_example.txt','r',encoding='utf-8')
fo.closed
False
fo.read()
'hello,world!'
fo.close()
fo.closed
True
fo.read()
 
实验结果:
 
第六章:类和对象
 一、实验目的:
 1.了解什么是类,如何定义和使用类;
 2.学习类的高级操作;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
 1.定义一个圆类,属性有:半径r,初始值为1.0;方法有:设置半径值,获取半径值,计算周长,计算面积。
 实验源代码:
from math import pi
class Circle():
    def _init_(self,r=1.0):
        self.r=r
    def get_radies(self):
        return self.r
    def set_radius(self,r):
     self.r=r
    def calc_circumference(self):
     return 2*pi*self.r
     def calc_area(self):
      return pi*self.r**2
 
实验结果:

2.Person类有属性name和age,方法say_hi()/Child类继承Person,并实例化一个Tony对象,执行say_hi方法。
实验源代码:
class Person():
 def __init__(self,name,age):
        self.name=name
        self.age=age
 def say_hi(self):
            print("Hi,I am {0:s} ,{1:d} years old.".format(self.name,self.age))
class Child(Person):
    pass
Tony=Child('Tony',5)
Tony.say_hi()
 
实验结果:
 
3.实例化一个Person类的时候,传入一个错误的年龄-20,这个错误无法被检查出来并处理,导致出现明显的错误。
实验代码:
class Person():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say_hi(self):
            print("I am {0:s},{1:d} years old.".format(self.name,self.age))
Tony =Person('Tony',-20)
Tony.say_hi()
 
实验结果:
 
4.用@property装饰器实现上题Person类中age属性的访问。
 实验代码:
1:
class Person():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        if age<0:
            self._age=0
        elif age>200:
            self._age = 200
        else:
            self._age=age
    def say_hi(self):
            print("I am {0:s},{1:d} years old.".format(self.name,self.age))
Tony =Person('Tony',5)
Tony.say_hi()
 
2:
class Person():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        if age<0:
            self._age=0
        elif age>200:
            self._age = 200
        else:
            self._age=age
    def say_hi(self):
            print("I am {0:s},{1:d} years old.".format(self.name,self.age))
Tony =Person('Tony',5)
Tony.say_hi()
Tom=Person('Tom',-5)
Tom.say_hi()
Amy=Person('Amy',230)
Amy.say_hi()
print(Tony.age+Tom.age+Amy.age)
 
实验结果:
 1:
 
2:
 
第七章:网络编程
 一、实验目的:
 1.了解网络编程的基础知识;
 2.学习socket模块中套接字类和内建方法;
 3.学习如何使用socket模块开发TCP服务器,UDP服务器和客户端程序;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
 1.查看Python的套接字socket模块提供的套接字类和套接字对象内置方法。
实验代码:
import socket
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print(type(tcp_socket))
print(dir(socket.socket))
 
实验结果:
 
2.TCP服务器端范例代码。
实验源代码:
import socket
HOST='127.0.0.1'
PORT=65432
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind((HOST,PORT))
tcp_server.listen()
print("Server starts listening ...")
conn,addr=tcp_server.accept()
print("Connected by",addr)
while True:
    data =conn.recv(1024)
    if data ==b'close':
          print('Server is closed!')
          break
    print(data)
    conn.sendall(data)
conn.close()
tcp_server.close()
 
实验结果:
 
3.用request库实现HTTP客户端抓取网页信息。
 实验源代码:
import requests
HEADERS={
    'User-Agent':
     'Mozilla/5.0 (Windows NT 10.0; Win64;x64) AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'}
URL="http://www.baidu.com"
r=requests.get(url=URL,headers=HEADERS)
print(f"status code:{r.status_code};encoding:{r.encoding}")
print("HTTP Source Code:")
print(r.content.decode())
 
实验结果:
 
4.基于ThreadingTCPServer类的多线程并发服务器范例。
实验源代码:
import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
         conn=self.request
         conn.sendall(b"Welcome ThreadTCPServer!")
         while True:
              data=conn.recv(1024)
              if data==b"close":
                    print('Connection is closed!')
                    break
              print("Recieve %s from %s" %(data,self.client_address))
              conn.sendall(data)
if __name__=='__main__':
 server=socketserver.ThreadingTCPServer(('127.0.0.1',65432),MyServer)
 print("Start ThreadTCPServer!")
server.serve_forever()
 
实验结果:
 
第八章:并发编程
 一、实验目的:
 1.了解进程和线程概念与相关含义;
 2.学习基于并发编程的Process类和基于线程并发教程的Thread类;
 3.学习多线程与多进程执行不同任务的性能比较;
 二、实验环境:
 1.笔记本电脑
 2.PyCharm Community Edition 2022.2.3工具
三、实验内容:
 1.使用Condition对象实现线程同步范例,创建一个生产者和五个消费者,五个消费者必须先等待生产者先生产,当生产者完成生产后,通知消费者消费。
 实验源代码:
from threading import Thread,Condition
g_sum=0
def consumer(con,id):
    global g_sum
    with con:
        print('Consumer %s waiting ...'%(id))
        con.wait()
        g_sum-=1
        print('Consumer %s consumed one resource'%(id))
def producer(con):
    global g_sum
    with con:
        print('Producer produce ten resources')
        g_sum+=10
        con.notifyAll()
if __name__ == '__main__':
    con=Condition()
    cs=[Thread(target=consumer,args=(con,i))for i in range(5)]
    p=Thread(target=producer,args=(con,))
    for c in cs:
           c.start()
    p.start()
    for c in cs:
        c.join()
print("g_num is left:%s.Exit..." %(g_sum))
 
实验结果:
 
2.Lock对象实现线程同步的范例
 实验源代码:
 没有使用线程同步机制
from threading import  Thread
g_sum=0
sum=499995000000
def child_thread():
    global g_sum
    for i in range(100000):
        g_sum=g_sum+i
if __name__ == "__main__":
     threads=[Thread(target=child_thread)for i in range(100)]
     for t in threads:
         t.start()
     for t in threads:
         t.join()
     print("g_sum should be:%s;g_sum:%s" %(sum,g_sum))
 
使用线程同步机制
from threading import  Thread,Lock
g_sum=0
sum=499995000000
def child_thread():
    global g_sum
    lock.acquire()
    for i in range(100000):
        g_sum=g_sum+i
    lock.release()
if __name__ == "__main__":
     threads=[Thread(target=child_thread)for i in range(100)]
     lock = Lock()
     for t in threads:
            t.start()
     for t in threads:
            t.join()
            print("g_sum should be:%s;g_sum:%s" %(sum,g_sum))
 
实验结果:
 没有使用线程同步机制
 
使用线程同步机制
 
3.使用pool类创建多进程的第二种方法是使用map_async()方法,把任务应用到可迭代对象的每一个元素上。
 实验源代码:
from multiprocessing import Pool
import os,time
def task(id):
     print('child process %s works on the task %s' %(os.getpid(),id))
     time.sleep(2)
if __name__== "__main__":
      print("Parent Process %s starts" %os.getpid())
      p=Pool()
      p.map_async(task,range(20))
      p.close()
      p.join()
      print("Parent Process ends")
 
实验结果:
 
4.创建两个线程,一个线程负责向队列写入数据,命名为producer(生产者);一个线程负责从队列读取数据,命名为consumer(消费者);设置从队列读取数据的时间为2秒,若未能读取数据,则抛出异常。
 实验源代码:
from threading import Thread
from queue import Queue
import os,time
def producer_task(q):
    for i in range(3):
        if not q.full():
            msg = "msg" + str(i)
            q.put(msg)
            print("producer puts:%s" % (msg))
        time.sleep(0.1)
def consumer_task(q):
    for i in range(3):
        msg = q.get(timeout=2)
        print("consumer gets:%s" %(msg))
        time.sleep(0.1)
if __name__=="__main__":
    print("Parent Process %s starts " %(os.getpid()))
    q = Queue()
    producer = Thread(target=producer_task, args=(q, ),name='producer')
    consumer = Thread(target=consumer_task, args=(q, ),name='consumer')
    producer.start()
    consumer.start()
    producer.join()
    consumer.join()
    print("Parent Process ends")
 
实验结果:

心得体会:
 Python语言或许更适合作为一门入门语言。首先从从语法上讲,Python语言比现在很多作为第一编程语言(C/C++、Visual Basic等)要简单很多。其次,这种解释语言的机制,更能让初学者体验到学习成果,不需要了解很多东西,也能编出个小程序来,这个过程比其他语言要快和简单很多。再次,从自学或者教学的角度来讲,搭建Python的基础开发环境再简单不过了,只要安装一个十几兆的程序,就得到了一个命令行工具,一个简单的GUI的IDEL,还有其他文档等,这样不必把时间太多用在开发工具上了,而像学习C++等一般还要去逐步熟悉Visual C++等工具。此外,还有一点就是Python的学习很有弹性,你学一点就能做点东西,而想要深入研究仍然有无穷的方向可以选择,因为Python的应用范围就是很广阔。









![[Java EE初阶]Thread 类的基本用法](https://img-blog.csdnimg.cn/196cfd101d1d49aba59c02956dd5e95a.png)









