管理员
Python初体验教程之二 《基本表达式(上)》
展开Biu

哈罗,各位,又见面了。因为前一阵子自己比较忙,所以第二课来得比较晚,大家有木有饥渴难耐啊?@146-想我就别憋着啊~

那么下面继续我们的Python旅行~

记得上一课里面,我曾经在最后提到了Python的Shell,也就是命令行界面(没看过上一课的童鞋请移步传送门)。不知道各位都安装了木有,下面要进入课程了。

Part One 算法

首先我们来讲讲算法的概念,我尽量抛开书本教条,用最直白的语言去阐述这个问题。所谓算法,就是计算机程序设计的一种方法。简单地说,就是要告诉计算机它要做什么事。计算机可以做很多事情,但是计算机自己并不会思考,所以需要人类用计算机能够懂的语言来告诉它,让它知道它该干嘛。算法这个名词看起来很高深,其实也就是程序设计的另一种说法而已。我们想要让计算机完成一件任务的方法不仅仅只有一种,可以有很多种方法。通过不同的代码实现不同的过程和步骤,最终达到同样一个目的,这就是算法的含义。精通算法的人可以用10行代码完成其他人用100行代码完成的事情,而且效率更高,这就是算法。

Part Two 数字和表达式

我们知道 Python Shell 同样可以被称作“交互式Python”解释器,你可以把它当作一个高级计算器来使用:

>>> 1+1

2

答案很显然是2。你如果愿意的话,当然也可以替换成其他的数字:

>>> 1234567+7654321

8888888

上面这些都只是加法,聪明的童鞋们一定想到了其他的方式:

>>> 2121-1212

909

>>> 11*22

242

当然还有减法和乘法,下面我们来看看除法:

>>> 1/2

0

你会发现,怎么是0呢? 一个整数(不包含小数部分的数)除以另外一个整数的时候,计算的结果是小数部分被省略掉了。虽然有时候我们需要这样的功能,但是在这里我们只要进行最普通的除法就好了,那要怎么做呢?我们需要使用实数,即包含小数点的数,而不是整数进行运算。实数在Python中被称作浮点数(Float-point Number):

>>> 1.0/2.0

0.5

怎么样,得出正确的结果了吧? 这样写也是可以的:

>>> 1.0/2

0.5

>>> 1/2.0

0.5

也就是说,只要在运算中有一个是浮点数,运算结果亦为浮点数。如果只是希望让程序执行普通的除法运算,那么可以程序前面或者在shell里面执行以下语句:from __future__ import division (注意句中的空格和future是前后各两个下划线),这样就合理多了:

>>> 1/2

0.5

但在这个时候,可以使用双斜线进行整除操作:

>>> 1//2

0

除了这些,我还想给各位介绍一个非常有用的运算符“%”,这是取余预算符:

>>> 1%2

1

>>> 10%2

0

>>> 19%5

4

看出来了么?这个运算符会将余数取出来,如果想设计一个程序,为每10秒钟检查一次端口是否被占用,那么就可以使用%10作为参数,如果结果为0,那么就执行检查操作,就这么简单。这一小节最后一个运算符是什么呢?那就是幂运算符:

>>> 2**3

8

>>> 4**3

64

看出来了么?相信你一定明白的。

Part Three 长整型数

如果你用Python处理一个非常大的数,你会看到下面的样子:

>>> 100000000000000000

100000000000000000L

嗯?末尾多出来了一个L。其实在Python中,普通数和长整型数的写法是一样的,唯一的不同仅仅是末尾多了一个L,在这个例子当中,Python把用户输入的数自动转换为了长整型数。长整型数与普通数是可以相互混用的,比如:

8989879587239L+6317

8989879593556L

Part Four 变量

变量是什么?如果你数学基本功不错的话应该很快可以回答出这个问题。其实计算机中的变量跟数学中的变量相差不多,比如说,你希望x代表的值为5,那么只需要这样写:

>>> x = 5

这个过程被称为赋值,赋值就是将5绑定到x上面,接下来就可以使用赋值后的x进行计算操作:

>>> x*8

40

很简单。当然变量可以是多个字符组成,比如:

>>> geeks = 5

>>> geeks ** 3

125

没有赋值的变量是无法运行的。

Part Five 获取用户输入

当我们在写程序的时候,并不一定要知道变量的值是多少。当然,程序最后也会知道变量是多少(这句话有点绕,不用太过于在意。),也就是说不赋值的变量也能运行,矛盾吗?或许是这样的,请往下看。

因为我们编写的程序是让其他人来使用的,我们不知道用户会提供什么值,所以我们需要通过用户所提供的值来赋予变量,在这里我们可以使用input函数,当然更多关于函数的东西我在后面的章节中会继续介绍的。

>>> input("Please type an number: ")

Please type an number: 1

1

shell 执行了input语句,并将字符串“Please type an number: ”打印出来,此时输入1,按下回车执行,结果就是我输入的1。这个例子似乎不太具有实用性,请看下面的例子:

>>> x=input("x= ")

x= 2

>>> y=input("y= ")

y= 3

>>> print x*y

6

这一段语句其实已经可以作为一段完整的程序了,后面输入的值是用户提供的,我们并不需要知道用户会输入什么值,程序会知道的。现在理解我上面的意思了吧?顺便提醒一下,指令中的符号应该在英文状态下输入。

基本表达式这一课内容较多,我们将分为两课来完成。这节课讲的东西,大家一定要好好掌握哈。把代码亲自输入一遍,而不是简单的copy,会有不一样的理解的。

凯文,不断提供优质资源!

该贴已经同步到 kevinyzd的微博

[查看全文]
1234567章鱼君
【章某鱼的学习笔记】想了下还是都放在一个帖子里比较好
展开Biu

本帖最后由 1234567章鱼君 于 2019-11-12 22:44 编辑

一楼就拿来当个目录什么的好了

以后要翻笔记的时候也方便一些

要是一直开贴记笔记应该是要刷屏了orz

[line3]记忆化搜索[/line3]

[查看全文]
1234567章鱼君
【章某鱼的学习笔记】并查集
展开Biu

将一个集合的元素都指向一个根节点

例题在这→https://www.luogu.org/problem/P3367

#include<bits/stdc++.h>

using namespace std;

const int MAX=200010;

int f[MAX];

int find(int x);

void fun(int x,int y)

{

f[find(f[x])]=find(y); //找到x的根节点和y的根节点,并使x的根节点指向y的根节点

}

int find(int x)

{

if(f[x]==x)

return x;

return f[x]=find(f[x]); //返回x指向的根节点的根节点,并使x指向最终的根节点

}

int main()

{

int N,M;

scanf("%d%d",&N,&M);

for(int i=1;i<=N;i++)

f=i;

while(M--)

{

int Z,X,Y;

scanf("%d%d%d",&Z,&X,&Y);

if(Z==1)

fun(X,Y);

else

if(find(X)==find(Y))

cout<<"Y"<<endl;

else

cout<<"N"<<endl;

}

return 0;

}

[查看全文]
1234567章鱼君
【章某鱼的学习笔记】大数相加+大数相乘
展开Biu

本帖最后由 1234567章鱼君 于 2019-11-9 17:55 编辑

#include<bits/stdc++.h>

using namespace std;

const int MAX=1e4; //定义数字最大位数

char A[MAX+5],B[MAX+5]; //存放数字

int ans[MAX+5]={0}; //存放相加结果

void Swap(char *A,int n)

{

for(int i=0,j=n-1;i<j;j--,i++)

swap(A,A[j]); //字符串逆序

}

int main()

{

scanf("%s%s",A,B); //以字符串的方式存放数字

int m=strlen(A);

Swap(A,m);

int n=strlen(B);

Swap(B,n);

for(int i=0;i<m;i++)

ans=ans+(A-'0'); //每一位数字相加存放ans中

for(int i=0;i<n;i++)

ans=ans+(B-'0');

int i;

for(i=0;i<MAX;i++)

{

ans[i+1]=ans[i+1]+ans/10;

ans=ans%10;

}

for(i=MAX-1;i>=0;i--) //判断ans长度

if(ans)

break;

for(i=i;i>=0;i--)

cout<<ans; //从后往前倒序输出

cout<<endl;

return 0;

}

[查看全文]
Jack_Criss