计算机科学与Python编程导论_MIT 学习笔记(三)

while 循环的工作过程
1 bool检验
2 如果bool检验为真,执行循环体
3 返回bool检验
4 直到bool检验为假,停止循环,执行循环体外的程序

while 循环的必要组件
1 在循环之前设置迭代变量
2 在bool检验中检验迭代变量
3 在循环体中改变迭代变量的值

编程思路:以求立方根为例
设置ans作为猜测,从0开始猜,直到ans**3>给定值,然后结束循环,判断最后的ans是否等于给定值**3.

x=int(input())
ans=0
while ans**3<x:
    ans+=1
if ans**3==x:
    print(str(x)+"'s root is "+str(ans))
else:
    print(str(x)+' has no root')

算法思路:构建一个递减函数,描述猜测值与目标值之间的差距,通过循环,是差距不断变小,当差距大于等于零时,结束循环。
在上面的例子中,该函数为 ans3x

这种猜测检查算法对有限可能的问题有效,这种穷举法穷举值域中的每个数。

for 循环的结构

forloop
for 循环的工作过程
1 标识符绑定到序列的第一个值
2 执行循环体
3 标识符绑定到序列的第二个值
4 执行循环体
5 重复直到标识符绑定到序列的最后一个值,并且执行完循环体,结束
6 或者中途遇到break,结束(跳出)循环

制作for循环中的序列:
range(m,n)=[m,m+1,,n1]
range(n)=[0,1,2,,n1] *即上式中m等于0。

例:求整数的立方根

x=int(input())
for i in range(abs(x)+1):
    if i**3==abs(x):
        break
if i**3!=abs(x):
    print(str(x)+' has no root')
else:
    if x<0:
        print(str(x)+"'s root is -"+str(i))
    else:
        print(str(x)+"'s root is"+str(i))

for 循环利用值域(range)实现了穷举

例:将十进制整数转化为二进制数(注意python3.X中‘//’才是对正常除法结果向下取整)

x=int(input())
if x<0:
    neg=True
    x=-x
else:
    neg=False
if x==0:
    print(0)
result=''
while x>0:
    result=str(x%2)+result
    x=x//2
if neg:
    print('-'+result)
else:
    print(result)

例:将十进制浮点数转化为二进制数(注意python3.X中‘//’才是对正常除法结果向下取整)

x=float(input())
p=0
while (2**p)*x%1!=0:
    p+=1
    print((2**p)*x-int((2**p)*x))

num=int((2**p)*x)

result=''
while num>0:
    result=str(num%2)+result
    num=num//2

for i in range(p-len(result)):
    result='0'+result
    print(result)

print(str(x)+'='+result[0:-p]+'.'+result[-p:])

上个例子的启示:
1 若没办法在一定位数内找到某个浮点数的二进制等价,系统会采用近似的方法来替代
2 所以在比较两个浮点数是否相等时,最好用相减小于一个足够小的数,而不是用==

例:用浮点数近似立方根

x=float(input())
epsilon=0.01
step=epsilon**2
ans=0.0
count=0
while (abs(ans**2-x))>=epsilon and ans<=x:
    ans+=step
    count+=1
print(count)
if abs(ans**2-x)>=epsilon:
    print('fail')
else:
    print(str(x)+"'s root is close to "+str(ans))

例:二分法求方根

x = 25
epsilon = 0.01
count=0
low=0.0
high=float(x)
ans=(low+high)/2

while abs(ans**2-x)>=epsilon:
    count+=1
    if ans**2>x:
        high=ans
    else:
        low=ans
    ans=(low+high)/2


print(ans,count)

二分法的启示:
1 从根本上缩短循环次数
2 适用于有优先次序的问题,如求方根,g**2随g的增大而增大

牛顿拉夫逊算法
在求多项式p的根时,对于猜测g,一个更好的猜测是:

g=gp(g)p(g)

例:用牛顿拉夫逊算法求方根

x = float(input())
epsilon=0.01
ans=x/2.0
count=0
while abs(ans**2-x)>=epsilon:
    ans=ans-(((ans**2)-x)/(2*ans))
    count+=1

print(ans,count)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Python Socket服务器,以下是一些基本的学习笔记: 1. 创建Socket服务器 使用Python中的`socket`模块创建Socket服务器,可以使用`socket()`函数来创建一个Socket对象,如下所示: ```python import socket # 创建一个Socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中,第一个参数`AF_INET`表示使用IPv4地址族,第二个参数`SOCK_STREAM`表示使用TCP协议,如果使用UDP协议,则应该使用`SOCK_DGRAM`。 2. 绑定Socket服务器 在创建Socket对象之后,需要使用`bind()`方法将Socket对象和一个IP地址及端口号绑定在一起,如下所示: ```python # 绑定IP地址和端口号 server_socket.bind(('127.0.0.1', 8888)) ``` 其中,`bind()`方法的参数是一个元组,第一个元素是IP地址,第二个元素是端口号。 3. 监听Socket服务器 在绑定IP地址和端口号之后,需要使用`listen()`方法开始监听Socket服务器,如下所示: ```python # 开始监听 server_socket.listen(5) ``` 其中,`listen()`方法的参数表示最大连接数,即同时可以连接的客户端数量。 4. 接受客户端连接 当有客户端连接到Socket服务器时,需要使用`accept()`方法来接受客户端连接,如下所示: ```python # 接受客户端连接 client_socket, client_address = server_socket.accept() ``` 其中,`accept()`方法返回一个元组,第一个元素是客户端的Socket对象,第二个元素是客户端的IP地址和端口号。 5. 接收和发送数据 客户端连接到Socket服务器之后,就可以进行数据的接收和发送了,使用`recv()`方法接收客户端发送的数据,使用`send()`方法向客户端发送数据,如下所示: ```python # 接收客户端数据 data = client_socket.recv(1024) # 发送服务器数据 client_socket.send(b'Hello, client!') ``` 其中,`recv()`方法的参数表示接收数据的最大字节数,`send()`方法的参数是要发送的数据,需要将其转换为字节串。 6. 关闭Socket服务器 当与客户端的通信完成后,需要使用`close()`方法关闭Socket服务器,如下所示: ```python # 关闭Socket服务器 server_socket.close() ``` 以上是关于Python Socket服务器的一些基本学习笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值