leo_logic

python注意点
1.不确定尾数问题:round(x,d):对四舍五入,d是小数截取位数 浮点数间运算及比较用round()函数辅助...
扫描右侧二维码阅读全文
23
2019/03

python注意点

1.不确定尾数问题:

round(x,d):对四舍五入,d是小数截取位数
浮点数间运算及比较用round()函数辅助
不确定尾数一般发生在10^-16左右,round()十分有效

2.大精度浮点数运算

运算过程:1.2e-3 + 0.01
①经过转换为12,4 + 1,2(12表示整数部分是几,4小数部分有几位)
②将小数位数对齐12,4 + 100,4
③运算结果112,4 即0.0112

3.运算注意点
①python的位运算过程不是十进制而是将数转二进制再运算同Java位运算
TIM截图20190323094955.png

②位运算(注意:位运算是真的在进行位运算)
对101取反:~101 得到-102(-0b1100110)
实际转换:101(D) --> 1100101(B)
-- 101这个数的二进制还有不光有1100101,它的二进制前还有很多的零,可能是32位。101取反的话前面的零都要变为1,后面的位变成了0011010,取反的时候是将整个字长取反。计算机是通过补码(源码取反再加1)来表达负数的。(切记:-0b1100110这是表象,计算机内部真的已经取反了,只是为了程序员看到,以补码的形式传递信息而已)
4.转移符的补充:
"b":回退
"n":换行,光标移动到下一行首
"r":回车,光标移到本行首
5.字符串方法并不改变原字符串本身
str.lower() 或 str.upper() 返回字符串的副本,全部字符小写/大写

                 "AbCdEfGh".lower()结果为"abcdefgh"

str.split(sep = None)返回一个列表,由str根据sep被分隔的部分组成

                 "A,B,C".split(",")结果为['A','B','C']

str.count(sub)

                 "a apple a day".count("a")结果为4

str.replace(old,new)

                 "Python".replace("n","n123.io")结果"python123.io"

6.python在什么情况下使用字符串或字节串呢?

字符串字节串
处理文本处理与内存相关或处理内容与字节相关时才使用

True和False
Python语言提供True和False表示真假
任何判断产生的结果是True或False
False的等价值是:None,0,0.0,0j,'',(),[],{}

7.分支语句注意else扩展功能:

for c in "PYTHON":
    if c =="T":
        continue
    print(c,end="")
else:
    print("正常退出")
#上面这段代码会输出“正常退出字样”,而下面这段代码不会,这就是for或while循环的扩展或奖励过程,只要循环是正常退出,else就会
for c in "PYTHON":
    if c =="T":
        break
    print(c,end="")
else:
    print("正常退出")

8.分支语句注意else扩展功能:

'''
以下异常处理代码在函数中时区别于不在函数中的执行顺序:
(1)程序正常时:
    ①try中return语句需要等待finally中的代码执行完毕后再执行
    ②try中无异常时else语句就不会执行
    ③程序返回try中的return
(2)程序异常时:
    ①try中不会执行
    ②执行except部分,但由于存在finally,except的return也不会立刻执行,print()执行后回去执行finally中的代码
    ③分析代码可以发现,finally中存在return,所以程序会返回finally中的return值
(3)总结:
    ①无论return在哪儿,finally一定执行
    ②try中有return,else不执行
    ③finally中的return会覆盖之前所有return
    
'''
def f(a):
    try:
        print(1/a)
        return 1/a #需等待finally中代码执行完毕才会执行
    except:
        print("except")
        return "except"
    else:
        print("else")
        return "else"
    finally:
        print("finally")
        return "except"

9.Python函数定义注意事项:
·默认情况下,参数不需要类型声明
·默认情况下,函数返回值不需要类型声明
·参数和返回值可以为0个或多个
·传统编程中如:c语言等,显示申明,通过声明使得函数占用的内存空间最少,但是现在多占几个字节、内存不是问题。只有在特定类型声明时需要
·函数只有被调用时才会执行,因为Python是解释性语言

  - 解释性语言:解释性语言的函数只有被调用的时候才会执行

10.函数参数值传递:

#注意点①:函数参数两种传递方式:函数位置和名称传递:
def fact(n,m) :
    s = 1
    for i in range(1,n+1):
        s *= i
    return s//m
print(fact(10,5))#位置传递,按顺序
print(fact(m=5,n=10))#名称传递,按名称

#注意点②:可选参数必须放在非可选参数后
def fact(n,m=1): #非可选参数(没有默认值)n必须放在可选参数之前
    s = 1
    for i in range(1,n+1):
        s *= i
    return s//m
print(fact(10)) 
print(fact(10,5)) #这儿的5会去覆盖fact(n,m=1)括号中默认的1

#注意点③:函数可以接收不确定总数的参数变量:
    1)字典类型:
def fact(n,**d): #**d表示字典形式
    s = 1
    for i in range(1,n+1):
        s *= i
    for item in d:
        s *= d[item]
    return s
print(fact(10,a=3)) #d={a:3}
print(fact(10,a=3,b=5)) #d={a:3,b:5}
   2)元组类型
def fact(n,*b): #*b表示元组形式
    s = 1
    for i in range(1,n+1):
        s *= i
    for item in b:
        s *= item
    return s
print(fact(10,3)) #d={a:3}
print(fact(10,3,5)) #d={a:3,b:5}

11.函数返回值:

函数可以返回零个或多个结果:
·return保留字用来传递返回值 或 表示函数结束
·函数可以有返回值,也可以没有,可以有return,也可以没有
·return可以传递0个返回值,也可以传递任意多个返回值

def fact(n,m=1):
    s = 1
    for i in range(1,n+1):
        s *= i
    return s//m,n,m
print(fact(10,5))

12.全局变量和局部变量的关系:

'''
规则1:局部变量和全局变量是不同变量
·局部变量是函数内部占位符,与全局变量可能重名但不同
      通过命名空间我们可以理解到,全局和局部函数即使是同名的但由于这个命名空间,python会认为它们是不同的
·函数运算结束后,局部变量被释放,全局变量不会被释放
·使用global保留字在函数内部声明并使用全局变量
'''
#局部变量和全局变量:
n,s = 10,100
def fact(n):
    s = 1                  #s是全局变量,与全局变量s不同
    for i in range(1,n+1):
        s *= i             #此处局部变量s是3628800
    return s
print(fact(n),s)           #此处全局变量s是100
结果:100,3628800

#规则2:局部变量为组合数据类型且未创建,等同于全局变量
ls = ["F","f"] #创建一个全局ls
def func(a):
    #ls= ["F","C"] #当去掉本段代码ls前的注释时会发现,打印的是['F', 'f'],证明这儿的ls是局部变量
    ls.append(a)  #此处ls是列表类型,未真实创建规则等同于全局变量
    return
func("c")      #全局变量ls被修改
print(ls)
>>> f =lambda:"lambda函数"
>>> print(f())
lambda函数

>>> f = lambda x,y : x + y
>>> f(10,15)
25

函数的递归:

函数定义中调用函数自身的方式:
链条:计算过程存在递归链条
基例:存在一个或多个不需要再次递归的基例
'''
    递归本身是一个函数,需要函数定义方式描述
    函数内部,采用分支语句对输入参数进行判断
    基列和链条,分别编写对应代码
    def fact(n):
    if n == 0 :
        return 1
    else:
        return n*fact(n-1)
    print(fact(10))

'''
#斐波拉切数列
def f(n):
    if n == 1 or n==2:
        return 1
    else:
        return f(n-1) + f(n-2)
print(f(8))

13.组合数据类型:包含一组数据且作为单一管理结构的数据类型

1.特性:
         ·顺序性:一组数据以无序或有序方式组织
         ·一致性:一组数据以相同或不同的类型组织
         ·索引性:一组数据能否以及采用序号或自定义索引方式组织
2.Python组合数据类型:3大类7小类:
        ·集合(无序、非一致、无索引):可变集合(set)、不可变集合( frozenset)
              注意:①集合的元素本身不可变但是可变集合的个数可变,只有不可变集合的元素和个数都不可变
                    ②使用set函数声明集合时值会拆分为单一元素赋值给集合变量如:A=set("pypy168")此时集合等同于A={'p','y','p','y',1,6,8}
                    ③集合元素可进行运算
                           例如:
                                A = {'p','y','p','y',168}
                                B = set("pypy168")
                                print(A-B)
                                print(B-A)
                           结果:
                               {168}
                               {'6', '8', '1'}
                    ④不可变集合类型:
                           frozenset()函数创建,表示frozenset({ })形式
        ·序列(有序、非一致/一致、序号索引):元组列表、字符串、字节串
               序列类型:一组数据的有序组合
                   ·有序:元素间存在顺序,因此,可以存在值相同的多个元素
                   ·非一致:元组和列表中元素类型可以不同
                   ·一致:字符串和字节串中元素类型必须相同
                   ·序号索引:采用正向递増或反向递减方式索引,根据序号精确访问单个元素
        ·字典(无序、非一致、自定义索引):字典
                字典类型:一组包含映射关系的数据组合
                   ·无序:元素间不存在顺序,因此,字典所包含“键值对”元素不能相同
                   ·非一致:毎个元素是一个键值对,其键和值类型均可不同
                   ·自定义索引:键值对相当于对“值”建立了新的以“键”为方式的索引
                python中空大括号默认生成空字典
3.可变类型与不可变类型:
         有些类型创建后其值不能被改变,有些却可以随时被修改:
             ·可变类型:值可以改变的类型,例如:列表、字典等
             ·不可变类型:值不可以改变的类型,例如:数值类型、字符/串、元组等
4.可哈希性和hash函数:
         hash(x)函数返回X的一个哈希值
             ·并不是所有类型都可以被哈希,不可变类型可以被哈希
             ·例如:数值类型、字符串、元组,列表和字典不能被计算哈希值

14.什么时候使用爬虫什么时候不使用爬虫

·获取数据不一定用爬虫
·适合手工完成:一次性的、数量较少的、数据不复杂的
·适合爬虫完成:周期性釆集、爬取站点较多、数据结构复杂但有规律

15.关于文件读写:

①处理大数据文件时不可使用一次读入的方式:

方式一:一次读入,统一处理(非大数据文件,推荐使用该方法)
fi = open(fname,"r")
txt=fi.read()#对全文txt进行处理,处理大数据文件程序效率会变低
fi.close()
方式二:按数据读入,逐步处理(大数据处理推荐这个方法)
fi = open(fname,"r")
txt = fi.read(20)
while txt != "":
    txt = fi.read(20)
fi.close()
②逐行读入操作:
方式一:一次读入,分行处理
fi = open(fname,"r")
for line in fi.readlines():  #对line进行处理
fi.close()
方式二:分行读入,逐步处理(推荐)
fi = open(fname,"r")
for line in fi:  
fi.close()
③如果写入文件中包含逗号怎么办?
引入:文件最好采用CSV格式(国际标准,就是逗号为分隔符)
有时我们会遇到,文件中文本内容包含逗号,的情况,解决方案:
    1)使用其他如空格、特殊符号做分隔符
    2)可以采用转义字符
#一维写入方式
ls = ['中国','美国','日本']
f = open('output.txt','w')
f.write(','.join(ls))
f.close()
④最好使用csv格式:
CSV,Comma-Separated Values
·国际通用的一二维数据存储格式,一般csv扩展名
·每行一个一维数据,采用逗号分隔,无空行
· Excel及所有数据库软件可读入井导出,一般编辑软件可编辑
⑤二维数组是按行存储还是按列存储呢?
1)按行和按例都可以,具体由程序决定
2)一般索引习惯先行后列 ls[row][column]
3)习惯上,外层列表每个元素是一行,按行存
Last modification:March 24th, 2019 at 03:32 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment