Python入门学习---第一天

输入输出,数据类型,字符串和占位符,条件语句,list和tuple

第一个.py程序

下载并安装python环境后,创建hello.py文件,编写如下内容:

print("hello world");

打开cmd输入命令,执行hello.py程序。如下:
这里写图片描述


输入和输出

输出:

print()函数可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出,如下:
这里写图片描述
print()函数会依次打印每个字符串,遇到逗号“,”会输出一个空格。因此我们会看到第一个输出是Think+2个空格+Java,而第二个输出是”Think Java”。

输入:

Python提供了一个input()函数,可以让用户输入字符串,并存放到一个变量里。如下:
这里写图片描述
以上写出所有内容。转载处:廖雪峰Python教程


Python的语法

Python的语法比较简单,采用缩进方写出来的代码就像下面的样子:

# print absolute value of an integer:
a = 100
if a >= 0:
    print(a)
else:
    print(-a)

# 开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块
缩进有利有弊。好处是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab。按照约定俗成的管理,应该始终坚持使用4个空格的缩进
缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。当你重构代码时,粘贴过去的代码必须重新检查缩进是否正确。此外,IDE很难像格式化Java代码那样格式化Python代码。


Python数据类型

整数
与其他语言类似,不同的地方是Python的整数没有大小的限制(我们经常会遇到大数的问题,强大的Python)。

浮点数
与其他语言类似,与整型一样没有大小限制。如果超出范围则显示inf(无穷大)。

字符串
与其他语言类似,’\’是转义符。
不同之处

  • r’ ‘ 表示 ’ ‘ 内部的字符串默认不转义。如下:
    这里写图片描述
    发现:最后’之前必须是偶数个斜杆,否则报错
  • Python允许用”’…”’的格式表示多行内容。如下:
    这里写图片描述
    发现程序输出包括换行

编写一段python程序

print(r'''hello,\n
world''')

得到非常满意的结果:
这里写图片描述

布尔值
与其他语言类似,用 TrueFalse 代表真、假
逻辑运算用 and、or、not 代表与、或、非

空值
空值用 None 表示。None不能理解为0。

变量
与其他语言类似。不同之处在于Python不需要声明是何种数据类型。
比如java声明变量n需要先定义在赋值,如:int n = 1。而Python直接赋值 n = 1。

a = 123     # a是整数
print(a)
a = 'ABC'   # a变为字符串
print(a)

这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言(如C/C++、JAVA等)

当我们写:

a = 'abc'

Python解释器干了2件事情:

  • 在内存中创建一个’abc’的字符串;
  • 在内存中创建了一个名为a的变量,并把它指向’abc’。

既然如此,我们考虑下面代码的执行结果。

a = 'ABC'
b = a
a = 'XYZ'
print(b)

我们想,b最后应该为’XYZ’。但很可惜,b的结果并没有被a改变,这与引用不同。
实际上,Python先在内存中创建了一个’XYZ’字符串,再将a指向’XYZ’。而不是更改a原先指向的内容。

常量
在Python中,通常用全部大写的变量名表示常量:

PI = 3.14159265359

实际上,PI仍然是一个变量,如果你想改变PI的值,没人会拦你。因为Python没有任何机制保证PI不会被改变

Python有两种除法。一种是/计算出来的是浮点数;另一种则是//整数(向下取整)。
Python还提供了一个求余运算%,与其他语言类似。

Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。

对变量赋值x = y是把变量x指向真正的对象,该对象是变量y所指向的。随后对变量y的赋值不影响变量x的指向。

转载处:廖雪峰Python教程


字符串和编码

编码

由于ASCII编码只有127个不同的表示方式,所以不能够存放所有例如中文、阿拉伯语言等其他国家的语言。

中国制定了GB2312编码,用来把中文编进去。

全世界很多国家语言都超过127个。如果每个国家都有他自己的编码格式会造成多语言的文本中,显示出来会有乱码。

因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码的问题了。

由于表示ASCII编码中的字符,需要Unicode的第一个字节补0。本着节约的精神,UTF-8出现了。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

工作原理图:
这里写图片描述

浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:
这里写图片描述

字符串
对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'

# 还可以用以下方式表示
>>> '\u4e2d\u6587'
'中文'

由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

在bytes中,无法显示为ASCII字符的字节,用\x##显示

反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
# 如果bytes中包含无法解码的字节,decode()方法会报错:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):
  ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
# 如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
''
# 要计算str包含多少个字符,可以用len()函数:
>>> len('ABC')
3
>>> len('中文')
2
# len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数:
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8'))
6

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

声明用的字符集是utf-8并不是真的为utf-8,想要设置成utf-8,需要将文件的属性编码集改为utf-8。

占位符,如下:

>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

与C语言类似。

常见占位符:

占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串:

>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'

有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'

format()
另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:

>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'

转载处:廖雪峰Pyhton教程


使用list和tuple

list

Python内置的一种数据类型列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。

# 比如,列出班里所有同学的名字,就可以用一个list表示:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
# 变量classmates就是一个list。用len()函数可以获得list元素的个数:
>>> len(classmates)
3
# 用索引来访问list中每一个位置的元素,记得索引是从0开始的;
# 当索引超出了范围时,Python会报一个IndexError错误:
>>> classmates[0]
'Michael'
>>> classmates[1]
'Bob'
>>> classmates[2]
'Tracy'
>>> classmates[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
# 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素:
>>> classmates[-1]
'Tracy'
# 以此类推,可以获取倒数第2个、倒数第3个;当然,倒数第4个就越界了:
>>> classmates[-2]
'Bob'
>>> classmates[-3]
'Michael'
>>> classmates[-4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
# list是一个可变的有序表,所以,可以往list中追加元素到末尾:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
# 也可以把元素插入到指定的位置,比如索引号为1的位置:
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
# 要删除list末尾的元素,用pop()方法:
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
# 要删除指定位置的元素,用pop(i)方法,其中i是索引位置:
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
# 要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
# list里面的元素的数据类型也可以不同,比如:
>>> L = ['Apple', 123, True]
# list元素也可以是另一个list,比如:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
# 要注意s只有4个元素,其中s[2]又是一个list,如果拆开写就更容易理解了:
# 要拿到'php'可以写p[1]或者s[2][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到。
>>> p = ['asp', 'php']
>>> s = ['python', 'java', p, 'scheme']
# 如果一个list中一个元素也没有,就是一个空的list,它的长度为0:
>>> L = []
>>> len(L)
0

tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字:

>>> classmates = ('Michael', 'Bob', 'Tracy')

现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。

不可变的tuple有什么意义?
因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。

tuple的陷阱:

# 当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
>>> t = (1, 2)
>>> t
(1, 2)
# 如果要定义一个空的tuple,可以写成():
>>> t = ()
>>> t
()
# 但是,要定义一个只有1个元素的tuple,如果你这么定义:
# 定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
>>> t = (1)
>>> t
1
# 所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:
>>> t = (1,)
>>> t
(1,)
# 最后来看一个“可变的”tuple;
# 元组中的list是不可变的,list的内容是可变的,这个理解起来很简单,跟其他语言的引用差不多。
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

练习

请用索引取出下面list的指定元素:

# -*- coding: utf-8 -*-

L = [
    ['Apple', 'Google', 'Microsoft'],
    ['Java', 'Python', 'Ruby', 'PHP'],
    ['Adam', 'Bart', 'Lisa']
]
# 打印Apple:
print(L[0][0])
# 打印Python:
print(L[1][1])
# 打印Lisa:
print(L[2][2])

转载处:廖雪峰Python教程


条件判断

if语句

与其他语言相比,elif是else if的缩写,完全可以有多个elif,所以if语句的完整形式就是:

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>

再议input

如下代码:

birth = input('birth: ')
if birth < 2000:
    print('00前')
else:
    print('00后')

输入1982,结果报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()

这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转化成整数。Python提供了int()函数来完成这件事情:

s = input('birth: ')
birth = int(s)
if birth < 2000:
    print('00前')
else:
    print('00后')

再次运行,就可以得到正确地结果。但是,如果输入abc呢?又会得到一个错误信息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'

原来int()函数发现一个字符串并不是合法的数字时就会报错,程序就退出了。

练习
小明身高1.75,体重80.5kg。请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数:

  • 低于18.5:过轻
  • 18.5-25:正常
  • 25-28:过重
  • 28-32:肥胖
  • 高于32:严重肥胖

if-elif判断并打印结果:

代码如下:

height = 1.75
weight = 80.5
BMI = weight/(height*height)
if BMI<18.5:
    print('过轻')
elif BMI<25:
    print('正常')
elif BMI<28:
    print('过重')
elif BMI<32:
    print('肥胖')
else:
    print('严重肥胖'.encode('utf-8'))

转载处:廖雪峰Python教程

第二天内容

猜你喜欢

转载自blog.csdn.net/qq_37340753/article/details/80969195