Python初学习系列(一)

前言

主要记录这一周学习python的过程。

一、Python的基本概念

python解释器是运行python语言编写的程序的软件,可在http://python.org/downloads 中下载,适用于windows、Linux和OS X,可在该网站直接练习代码。下载完成,找到IDLE(python GUI),初次出现的IDLE的窗口,类似如下:

上图就是交互式环境,很像windows上的命令行提示符。一些简单操作如下:

 

当遇到报错时,可上网搜索,寻找问题的答案。https://inventwithpython.com/blog/别人的博客上的编程指南可以参考。 

二、第一部分 python编程基础   (2021/7/14)

第一章:python基础:介绍表达式、python指令的最基本类型,如何使用python的交互式环境运行代码。

交互式环境执行一条Python指令运行一条。2+2称为表达式,包含值和操作符。

Python初学习系列(一)_第1张图片

变量名只能是一个词,只能包换字数数字和下划线,不能数字开头。变量一般用小写字母开头。驼峰形式lookLikeThis。#后面的表示注释。str(),len(), int(),float()。

Python初学习系列(一)_第2张图片

当参数n不存在时,round()函数的输出为整数。当参数n存在时,即使为0,round()函数的输出也会是一个浮点数。此外,n的值可以是负数,表示在整数位部分四舍五入,但结果仍是浮点数。

在python2.7的doc中,round()的最后写着,"Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0." 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

但是到了python3.5的doc中,文档变成了"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

所以如果有项目是从py2迁移到py3的,可要注意一下round的地方(当然,还要注意/和//,还有print,还有一些比较另类的库)。

简单的说就是,round(2.675, 2) 的结果,不论我们从python2还是3来看,结果都应该是2.68的,结果它偏偏是2.67,为什么?这跟浮点数的精度有关。我们知道在机器中浮点数不一定能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。以上。除非对精确度没什么要求,否则尽量避开用round()函数。近似计算我们还有其他的选择:使用math模块中的一些函数,比如math.ceiling(天花板除法)。python自带整除,python2中是/,3中是//,还有div函数。

字符串格式化可以做截断使用,例如 "%.2f" % value(保留两位小数并变成字符串……如果还想用浮点数请披上float()的外衣)。当然,对浮点数精度要求如果很高的话,请用decimal模块。

第二章:控制流:解释如何让程序决定执行哪些指令,使得代码智能响应不同的情况。(7/15)

学习了and,or,not。Python先求值not操作符,再求值and操作符,最后是or操作符。学习了if elif else while break continue.类真,类假,0,0.0和‘’(空字符串)被认为是假,其他是真的。运行一个有缺陷的程序,导致陷入无限循环,按Ctrl-C,程序就会发出KeyboardInterrupt,导致立即停止。

for i in range(5): 0 1 2 3 4
for i in range(12,15): 12 13 14
for i in range(0,10,2):0 2 4 6 8

内建函数 print() input() len() 标准库 math模块有数学运算相关的函数,random模块有随机数相关的函数等。使用模块函数前,必须import导入该模块。

import  random

random.randint(1,10) 调用1和10之间的一个随机整数(包括1和10)

from random import *

print(randint(1,10)) 不需要random前缀,但可读性不强,建议使用普通形式的import语句。

sys.exit()程序终止或退出。

abs()返回绝对值。

第三章:函数:如何定义自己的函数,将代码组织的可管理。

定义的函数的参数也叫变元,保存在变元中的值,函数返回后就丢失。None表示没有值,是NoneType数据类型的唯一值,其他编程语言可能称这个值为null、nil或者underfined。对于所有没有return语句的函数,默认在末尾加上return None。使用不带值的return语句,返回也是None。

 print()函数自动在传入的字符串末尾添加了换行符,可以设置end关键词参数,将它变成另一个字符串。因为在fwgw后面不打印换行,而是一个空字符串。相当于禁用print()函数调用末尾的换行。类似的,在print()中传入多个字符串,会自动用一个空格分隔它们,当传入sep关键字参数时,可以替换掉默认的分隔字符串。

print('fdwfe')
print('fewfg')
print('fwgw',end='')
print('dfwfef')
fdwfe
fewfg
fwgwdfwfef
>>> print('fdw','fdwfe','fqefq')
fdw fdwfe fqefq
>>> print('dwf','fwef','fwef',sep=',')
dwf,fwef,fwef

在被调用函数内赋值的变元和变量,处于该函数的“局部作用域”,在所有函数之外赋值的变量,属于“全局作用域”。作用域的重要性,全局作用域的代码不能使用任何局部变量,但是局部作用域可以访问全局变量,一个函数的局部作用域不能使用其他局部作用域的变量。在不同的作用域中库用相同的名字命名不同的变量。如果在一个函数中,有针对该变量的global语句,它就是全局变量。变量没有用在赋值语句中,它就是全局变量。

def spam():
    print(eggs)
eggs = 'dwede'
spam()

上面代码是正确的,下面代码是错误的。这个错误是因为spam()函数中有赋值语句,就会认为eggs变量是局部的,但是print在赋值之前,此时该局部变量不存在,所以不会退回使用eggs变量。

def spam():
    print(eggs)
    eggs = 'dwef'
eggs = 'dwede'
spam()

将函数作为黑盒,因为鼓励在编写函数时不使用全局变量,所以不必担心函数的代码会与程序其他部分交叉影响。错误可以由try和except语句处理。如何在try子句中的代码导致错误,会转到except子句中。这样检测到错误后会运行代码,不会报错。

def spam(div):
    try:
        return 42/div
    except ZeroDivisionError:
        print('defee')
print(spam(2))
print(spam(3))
print(spam(0))
print(spam(-1))
21.0
14.0
defee
None
-42.0
None的数据类型是NoneType.

第四章:列表:介绍列表的数据类型,解释如何组织数据。(7/18)

列表是一个值,包含多个字构成的序列,术语列表值指列表本身(它作为一个值,可以保存在变量中,或传递给函数,跟其他值一样),列表用左括号开始,右括号结束。列表中的值为表项,表项用逗号分开,感觉类似数组。下标一般从0开始向上增长,也可以负数开始,

-1指的是列表中最后一个下标。下标取单值,切片取多值,不包括第二个下标值。省略第一个下标默认是0,省略第二个下标是末尾。len()取得列表长度。del删除列表下标处的值,向前移动,不会用于删除简单变量,几乎用于删除列表中的值。in 和not操作符,确定值是否在列表中。多重赋值,变量的数目和列表的长度要严格相等。否则给出ValueError错误。增强的赋值操作符+=。

方法部分跟在一个值后面,以一个句号分隔。列表中index()方法传入一个值,如果该值在列表中,返回它的下标,如果不在,则报ValueError。如果是重复的值,则返回第一次出现的下标。使用append()方法在列表中添加值。使用insert()方法在列表任意位置添加值,第一个参数是新值的下标,第二个参数是插入的新值。这些方法属于单个数据类型,只能在列表上调用,当用在其他时,会产生AttributeError错误。remove()方法删除列表中值,如果该值在列表出现多次,只会删除第一次出现的值,注意当知道想要删除的值在列表中的下标,del语句好用,如果知道列表中删除的具体值,remove()方法好用。数值的列表和字符串的列表,用sort()方法排序,默认正序排序,可指定reverse关键字参数为True,让sort()按逆序排序。注意点,sort()方法当场对列表排序,不要写出赋值语句;不能对数字和字符串都有的列表排序;对字符串排序时,遵循“ASCLII字符顺序”,大写字母排在小写字母之前。如果需要按普通的字典顺序排序,在sort()方法调用时,将关键字参数key设置为str.lower,这将导致sort()方法将列表中所有表项当成小写。

spam = ['a','z','A','Z']
spam.sort()
print(spam)
spam.sort(key=str.lower)
print(spam)
运行结果
['A', 'Z', 'a', 'z']
['A', 'a', 'Z', 'z']
行末使用续行字符\,将一条指令写成多行。

可以将字符串看成是单个文本字符的列表。列表是“可变的”数据类型,它的值可以添加,删除或者改变。而字符串是“不可变的”。改变一个字符串使用切片和连接。

元组数据类型,元组输入时用(),元组像字符串一样是不可变的。如果只有一个值,在该值后面加一个逗号,否则会认为是一个普通括号里输入一个值。如果需要一个永远不会改变值的序列,就用元组。

>>> type(('hello',))

>>> type(('sdfw'))

list()和tuple()该返回传递给它们的值的列表和元组版本。

将列表赋给一个变量时,实际是将列表的引用赋给该变量,所以当列表变化时,该变量也会变化,感觉类似于指针。在变量必须保存可变数据类型时,例如列表和字典,python就会使用引用,对于不可变的数据类型值,例如字符串,整型或元组,python变量就保存值本身。

copy的模块包含copy()和deepcopy()函数。copy.copy(),用来复制列表或字典这样的可变值,不是复制引用。deepcopy()针对复制的列表中还包含列表的情况。

你可能感兴趣的:(Python初学习,python,pycharm,c++)