程序是什么?就是一堆代码啰。但是代码是有组织而来的,不是凭空堆砌出来的。有一个“古老”的说法:程序=数据结构+算法,意思是,程序是由一些数据结构(数据的组织结构)加上某些算法而形成的。从这个角度,算法才是主驱动力,而数据结构是服务于算法的(当然你可能因为有了某个很好用的数据结构而设计了某个算法,但算法仍然是主角)。那算法又是什么?算法就是设计好的,达成某个事情的步骤。所以,从这个角度,程序只是某些步骤的表现,这些步骤也叫流程,而程序就是流程表现。

我赞成这个“古老”说法(或者是我对它的解读),程序只是封装流程的外壳,因而,程序跟算法是两码事,虽然它们是有关联的。程序只是算法的一种表现,但不是唯一的表现,算法还可以用笔写到纸上,还可以用算盘表现出来,还可以通过一些对答、比喻或类比表达出来,还可以通过实际操作表现出来。算法可以是通用的设计步骤,也可以是某个领域的特有的设计步骤。算法有专门的设计与分析,它并不需要程序来支撑。算法是魂,程序是壳,存在这些情况:“算法很强,但程序很烂”(壳写不好)、“程序很强,但算法很烂”(魂设计不好,但很会封装)。

如果程序只是一个壳,那是不是就不重要了呢?肯定不是了,写壳,也是技术活,也要设计,也讲经验,也要学习。而且,程序能手是可以通过程序去设计算法的,比如他们可以熟悉地通过if/while这些结构去设计算法,当然,这不是必须的,也未必是好的设计算法的办法。特别是,对于程序开发,比如前后端、客户端等开发,你不熟悉掌握写程序(写壳)的技能与知识,你是站不住脚的,但未必要求你要有很强的算法设计能力。

好了,说了一堆废话。其实我是想说python的语言特性,掌握这些特性才能更快更好地把壳写好。跟练习打篮球一样,一开始先把分解动作做好,之后再连贯起来--那如果不练分解而直接连贯,行不行?也行,练分解不是必须的,特别是对工具的使用,边用边搜索也是个好办法,但本文的介绍,是从分解开始。

python的语言特性可以分:变量、数据类型(数据结构)、语句、代码组织等。

(1)变量

变量,就是值可以改变的量,所以变量是用来存放值的。在python中定义一个变量,就是把一个值给这个变量,所以你想忘记初始化都不行,你一定要把值给变量的,而在给值时,这个变量的类型就确定下来了,是的,变量都有类型。python内置了不少好用的类型(也可以叫数据结构),这个后续再详细介绍。

需要什么变量?这个跟流程有关,比如,假设流程是把输入的两个数相加,那就可以考虑使用两个变量,用于保存输入的值,比如这样:

最简单的想法,就是流程中需要保存(临时或长期保存)什么值,就设计什么变量。

(2)流程

流程是主角。

如果说一个程序的逻辑不行,一般是说程序在流程处理上不行,而经常说的“程序算法”,说的就是流程的设计。程序是对流程的封装,前提是,这个流程要想好,要设计好,当然,流程(或算法)也不一定要你来设计,别人设计你来翻译也是可以的。

程序就是对流程的翻译。所以,以前有一段时间,部门主管教我写代码,是要我先用注释把流程的每一步写好,然后再写代码翻译。当然由于注释可能是不必要的负担,才慢慢地不写步骤上的注释,但意思就是要形成习惯:先设计好流程,再来写代码。

不管流程的具体内容是什么,从结构来看,流程可以区分成三种:顺序流程、分支流程、循环流程。

顺序流程,就是从上到下一句一句地执行的流程,这样的流程必然会存在。分支流程(if/else),就是根据不同的条件,选择执行的操作。循环流程,就是重复地执行某些操作。

这三种流程,基本上都是混合使用,以组合拳的方式出现,比如下面的“猜数字”:

# -*- coding: utf-8 -*-
import random secret=random.randint(0,100)
temp=input("请说出我想的数字:");
guess=int(temp)
while guess!=secret:
if guess>secret:
print("没有这么大,说个小的!")
else:
print("太小了,说个大的!")
temp=input("猜错了,再来一次吧:")
guess=int(temp)
print("厉害,猜对了!")

上面这个“猜数字”游戏,用到了循环(while)与分支(if..else)的流程。

具体上,对于分支流程,一般有两种表达形式:

if ... else

if ... elif ... else

对于循环流程,一般有两种表达形式:

while xx:

for xx in []:

再写两个程序,一个打印“钻石”,一个打印九九乘法表:

i=1
while i<=17:
cnt = i
if i>9:
cnt = 18-i
starcnt = (cnt-1)//2
spacecnt = 4-starcnt
print(" "*spacecnt, end="")
print("*"*starcnt,end="")
print("*", end="")
print("*" * starcnt, end="")
print(" " * spacecnt)
i+=2
j=1
while j<=9:
i=1
while i<=j:
print("%d * %d = %d"%(i,j,i*j), end="\t")
i+=1
print("")
j+=1

发现规律并设计,是得到流程的重要办法。

打印效果如下:



好了,以上介绍了变量跟流程,特别是对流程的翻译即语句的使用。一门语言是一种工具,你要学着去用,边用边试错,才能更好更快地掌握它,不要拘泥于细节,除非细节影响到你解决问题了。

有缘再见,see you。

python应用(4):变量与流程的更多相关文章

  1. Python档案袋(变量与流程控制)

    变量与运算 得到数据类型: ii=100 print(type(ii)) #输出:<class 'int'> 强制转换: ii=100 iix=str(ii) #可为int str flo ...

  2. Python-第一篇-python初识及变量

    <work smart>主动分享成果和经验,与同伴共同成长</smart work> 启文:使用20多种编程语言,对大家说节日快乐 万国码使用16位(至少)表示内容: ASCI ...

  3. Python第二天 变量 运算符与表达式 input()与raw_input()区别 字符编码 python转义符 字符串格式化 format函数字符串格式化 帮助

    Python第二天  变量  运算符与表达式  input()与raw_input()区别  字符编码  python转义符  字符串格式化  format函数字符串格式化  帮助 目录 Pychar ...

  4. Python学习--03变量类型

    变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创 ...

  5. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  6. 【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

  7. python中的变量和数据类型

    一.变量定义:变量是计算机内存中的一块区域,存储规定范围内的值,值 可以改变,通俗的说变量就是给数据起个名字. 二.变量命名规则: 1. 变量名由字母.数字.下划线组成 2. 数字不能开头 3. 不可 ...

  8. Python动态生成变量

    Python 也可以像javascript那样动态生成变量.我们看javascript的动态生成变量. var obj = {}; for (var i =0, len = 10; i < le ...

  9. Python中的变量、引用、拷贝和作用域

    在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没 ...

随机推荐

  1. Azure Data Factory(二)复制数据

    一,引言 上一篇主要只讲了Azure Data Factory的一些主要概念,今天开始新的内容,我们开始通过Azure DevOps 或者 git 管理 Azure Data Factory 中的源代 ...

  2. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  3. CF1324B

    感觉 \(O(tn^2)\) 不是正解,于是弱弱的发了一波 \(O(tn)\) . 题意描述 你谷还没有人翻译,这里就简单介绍一下. 给你一个长为 \(n\) 的序列,如果它的一个长度至少为 \(3\ ...

  4. leetcode25word-ladder

    题目描述 给定两个单词(初始单词和目标单词)和一个单词字典,请找出所有的从初始单词到目标单词的最短转换序列的长度: 每一次转换只能改变一个单词 每一个中间词都必须存在单词字典当中 例如: 给定的初始单 ...

  5. Go语言如何像foreach一样有序遍历map

    目录 问题 解决 给key排序思路 开源实现 问题 Go语言的Map是无序遍历的,遍历一个map代码如下 package main import ( "fmt" ) func ma ...

  6. 服务器断电导致的ORACLE异常 : ORA-00214 ORA-01033 ORA-01034 ORA-00172 ORA-27101

    工作环境中的集群迁移之后,oracle出了挺多问题,最开始一直没找到原因,后来发现做迁移的人是冷迁移的,且数据库节点是硬关机的,惊了( 表现症状有不能登陆,登录了不能操作等 第一个报的是 ORA-00 ...

  7. 性能问题,AWR High Event enq: US - contention

    1.1问题现象  应用反馈业务执行SQL响应超时,需要数据库排除DB是否存在问题,创建AWR观察到top event 新增enq: US - contention  ??? 1.2问题分析 1) DB ...

  8. 经典c程序100例==91--100

    [程序91] 题目:时间函数举例1 1.程序分析: 2.程序源代码: #include "stdio.h" #include "time.h" void mai ...

  9. PF_PACKET&&tcpdump

    linux下抓包原理 linux下的抓包是通过注册一种虚拟的底层网络协议来完成对网络设备消息的处理权.当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,当抓包模块把自己伪装成一个网络 ...

  10. IP 层收发报文简要剖析4--ip 报文发送

    无论是从本地输出的数据还是转发的数据报文,经过路由后都要输出到网络设备,而输出到网络设备的接口就是dst_output(output)函数 路由的时候,dst_output函数设置为ip_output ...