zoukankan      html  css  js  c++  java
  • 【Python全栈笔记】01 [模块二] 14-15 Oct 运算符和字符串 4-1

    编码的问题

    中文版 Windows 终端是默认GBK编码格式,python2默认为ASCII编码,虽然我们注释了需要用UTF-8,但是通过命令行运行的文件如果print中文内容还是会出现乱码。

    Unicode, UFT-8, GBK 分别是三种不同的编码,Unicode在转为UTF-8或GBK时需要经过编码的过程,而UTF-8或GBK变为Unicode则需要经过解码。因此UTF-8和GBK的转化就需要经过一个解码和编码的过程。所以即使我们在py文档里注明了使用utf-8编码,在默认使用gbk的终端里,出现的中文是会乱码的。

    因此,在中文windows终端运行python2文件,我们需要对内容先解码再编码,如下: 这样以后我们在终端看到的就可以是正确的中文字了 (使用decode()和encode()先将内容从utf-8解码,然后再编码为gbk显示)

    在python3里,python编码做了优化,自身转化utf-8, unicode, gbk, 移除了python的utf-8类型

    **Q: python3里的文本都可以正常显示在终端里,在使用python2.7的Ubuntu里,直接print的中文正常显示,而decode再encode的中文字符反而乱码了。TBD 

    naomi@ubuntu:~/Desktop$ cat test
    #!/usr/bin/python
    # -*- coding:utf-8 -*- 
    
    val = '中文咯'
    val_unicode = val.decode('utf-8')
    val_gbk = val_unicode.encode('gbk')
    print(val_gbk)
    
    print('这也是中文')

    运算符

    '//' 取整 

    使用PyCharm IDE来创建Python项目文件,设置默认模板(Files - Settings - Editor - File and Code Template 在python文件里添加 #!/usr/bin/python 设置即可)

    python2里的'/'除法不显示小数的问题,可以通过from __future__ import division 来得到小数结果 

    PyCharm里p2和p3的切换:files - settings - 目标project - interpreter 选择p3即可 

    成员运算符

    in 

    not in 

    str1 = 'big brother is watching you'
    text1 = 'big' in str1
    text2 = ' ' in str1
    text3 = 'isw' in str1
    text4 = 'ther' in str1
    
    print(text1) # True
    print(text2) # True
    print(text3) # False
    print(text4) # True
    
    list1 = ['big', 'brother', '1', 'watching', ' you']
    
    text5 = 'big' in list1
    text6 = ' ' in list1
    text7 = 'ther' not in list1
    
    print(text5) # True
    print(text6) # False
    print(text7) # True
    View Code

    身份运算 [TBD]

    基本数据类型 [每个数据类型的功能可以通过在pycharm里按ctrl点击要further的内容找到reference] 

    数字    int 

    字符串 str

    布尔值 bool

    列表    list 

    元组    tuple 

    字典    dict  

    查看对象的类,或对象所具备的功能 

    .type() 可以获取每个变量的数据类型

    .dir() 可以获取某个变量所具备的所有功能

    .help('类') 查看某个类的具体方法及其用法 

    a = 'andy'
    
    print(type(a))  # 得到结果 <class 'str'>
    print(dir(a))  # 得到字符串 a 所具有的所有方法
    
    b = help(a)  # 显示'andy' 字符串并没有python文档 
    
    c = help(type(a))  # 显示 字符串 类 的所有信息(包括方法的解释说明)

    基本数据类型的常用功能 

    1. 整数int型 

    number1 = 1
    number2 = 2
    
    print(number1 + number2)  # 效果和下面一行一样。本质是调用了number1的__add__()方法先进行了转换
    print(number1.__add__(number2))
    
    # bit_length()表示某个整数的二进制至少占几位
    # 如下面计算数字的二进制占位
    
    number3 = 4  # 00000100
    number4 = 1024  # 10000000000
    print(number3.bit_length())  # 结果3, 至少占3位 
    print(number4.bit_length())  # 结果11, 至少占11位

    2. 字符串str型 

    s1 = 'andy'
    
    
    # 字符串改为首字母大写
    print(s1.capitalize())
    # Andy
    
    
    # 将字符串按照指定长度居中,空白按需补足
    print(s1.center(20,'*'))
    # center()方法第一个参数是设置总字符串长度,第二个参数用于填充空白
    # ********andy********
    
    
    # 数出子字符串在字符串中出现的次数
    s2 = 'andy dufresne stands for hope'
    print(s2.count('a'))
    print(s2.count('e'))
    # 计算'a'在s2字符串里出现的次数 结果为 2
    # 计算'e'在s2字符串里出现的次数 结果为 3
    print(s2.count('d', 0, 4))
    # 数出'd'在s2字符串从第1到第4位置出现的次数,结果为 1
    
    
    # 判断字符串是否以某子字符串结尾
    print(s2.endswith('e'))
    print(s2.endswith('hope'))
    print(s2.endswith('a'))
    # 判断是否以特定字符串结尾 结果分别为True, True, False
    print(s2.endswith('dy',0,4))
    # 还可以指定字符串的起始和终止位置,如上例,判断s2字符串第一到第四位字符串是否以'dy'结尾,结果返回True
    
    
    # 将tab转为8个空格
    s3 = 'hello	world'
    print(s3.expandtabs())
    print(s3.expandtabs(20))
    # expandtabs() 方法将字符串里的tab自动转为空格,默认转8个空格,在参数里可以指定空格数量
    # 由于编译器可能会自动将键盘输入的tab键转为空格,我们可以通过'	'来确定输入的tab
    
    
    # 在字符串里找到子序列并返回位置
    print(s3.find('he'))
    print(s3.find('l'))
    print(s3.find('n'))
    # find()方法在s3字符串里顺序查找'he', 'l', 'n',一旦找到就返回起始位置,且仅返回第一个找到的字符串的位置。
    # 如果说s3里没有想要查找的字符串,结果返回-1
    # 上例结果分别为0, 2, -1
    
    
    # format()字符串格式化,动态参数
    s4 = 'hello {0} from {1}'
    s5 = s4.format('bender', 'futurama')
    print(s5)
    # s4里的{0}, {1}相当于是一个placeholder,利用format可以按序输入参数
    # 如上例结果就是 hello bender from futurama
    
    # index() 找到子序列的位置,如果没有找到,报错
    # 类似 find()功能
    str1

    查看源码来看一个方法是否需要传入参数,传入几个参数。如果源码里只有(self),则不需要传参数
    功能里参数输入的地方(self, arg0, arg1 = None, arg2 = None)以左为例,最多传3个参数,第一个参数arg0必传, 第二个和第三个参数默认为None,可以不传也可以传

    s6 = 'andY56'
    print(s6.isalnum())  # 判断字符串是否全是字母和数字
    print(s6.isnumeric())  # 判断是否去哪是数字 False
    print(s6.isalpha())  # 判断是否全是字母 False
    
    
    # isspace() 确定是否所有都是空格
    space1 = '    	  
     '
    print(space1.isspace())  # 判断是否所有都是空格 True
    
    
    # istitle() 确定一个字符串是否为标题
    title1 = 'The School'
    title2 = 'Old McDonald Has a Farm'
    print(title1.istitle())  # 判断是否是标题,所有单词首字母大写,且其他字母小写
    print(title2.istitle())  # McDonald人名出现两个大写判断为False, 冠词a首字母没有大写判断False,所以其实这个方法并不能真实判断一个字符串是否为标题
    
    
    # join方法将可迭代的参数通过指定的字符连接起来
    # 如下,将一个list通过' '空格或者 '***'连接起来 同样适用于元组
    list1 = ['kenny', 'is', 'mysterion']
    joint1 = ' '
    joint2 = '***'
    print(joint1.join(list1))  # kenny is mysterion
    print(joint2.join(list1))  # 得到结果kenny***is***mysterion
    
    # ljust() 内容左对齐,可以指定长度,右边按需填充
    str1 = '  well this is embarrassing'
    print(str1.ljust(30), '---')
    # 得到结果   well this is embarrassing           ---
    # 指定长度如果超过字符串长度,超过的部分为空格,然后在后面再添加'---',如果指定宽度小于字符串,则将字符串输出完毕后再加上添加的'---'
    # 如果改为rjust, 则变为右对齐
    
    
    # strip(), lstrip(), rstrip() 分别去除字符串两边的空格,左边的,右边的
    str2 = '  obviously this is a test   '
    print(str2.strip())  # 结果为'obviously this is a test'
    print(str2.lstrip())  # 结果为'obviously this is a test '
    print(str2.rstrip())  # 结果为'  obviously this is a test'
    
    
    # partition() 将字符串分割为前,中,后三个部分
    str3 = 'knock knock knock '
    print(str3.partition('ock'))
    # 结果为 ('kn', 'ock', ' knock knock ')
    
    # replace() 输入需要替换的内容,替换后的内容,替换的次数(不输入默认全部替换)
    print(str3.replace('kn', 'kk'))  # 结果 kkock kkock kkock
    print(str3.replace('kn', 'kk', 2))  # 结果 kkock kkock knock
    # 输入数字超过3 以及负数,发现结果是全部都替换了
    # 输入数字0,则没有替换
    
    # split() rsplit() 将字符串按照要求分割
    str4 = ' split this sentence '
    print(str4.split())  # 不指定的时候,按照空格分隔 ['split', 'this', 'sentence']
    print(str4.rsplit('i'))  # 出现'i' 就分割一次
    print(str4.rsplit('e',2))  # 从右边开始看到'e'分割,一共分割两次
    
    # 在stackoverflow 里看到有人问split()和rsplit()的效率问题,通过timeit()测试得知这两个方法的速度差不多(split()略快一点点可以忽略不记),不过rsplit()还需要多打一个'r',所以看来如果满足同样的需求采用split()即可
    
    
    # splitlines() 根据换行符分割
    str5 = '''remember
    remember
    the fifth of November
     hmm    
     not funny actually 
    bummer'''
    print(str5.splitlines())
    # 得到结果 ['remember', 'remember', 'the fifth of November', ' hmm    ', ' not funny actually ', 'bummer']
    
    
    # swapcase() 改变大小写
    str6 = 'Ah.... The FrAy aNd ColdPlay'
    print(str6.swapcase())  # 得到结果 aH.... tHE fRaY AnD cOLDpLAY
    
    # title() 自动变成title 格式
    print(str6.title())  # 结果 Ah.... The Fray And Coldplay

    字符串索引 

    string[0], string[-3]

    字符串切片

    string[2:], string[2:12], string[-3:]

    for 循环 

    for item in string: 

      print(item)

    依次输出string里的内容

    for循环液可以搭配break, continue 来使用 

    # string的索引,切片
    str7 = 'string_example'
    print(str7[-3:])
    print(str7[3:])
    print(str7[:])
    
    str8 = 'python'
    for i in str8:
        print(i)
    '''
    得到结果:
    p
    y
    t
    h
    o
    n
    '''
  • 相关阅读:
    进程间通信 —— 命名管道
    判断当前线程是否有管理者权限
    获取操作系统OS等相关信息
    VS2017编译动态链接库报错
    git rebase 和 git merger
    Android开发之深入理解泛型extends和super的区别
    Android开发之深入理解Android Studio构建文件build.gradle配置
    Android开发之深入理解Android 7.0系统权限更改相关文档
    Android 开发之深入理解安卓调试桥各种错误解决办法
    自定义弹窗 VS AlertDialog分享弹窗
  • 原文地址:https://www.cnblogs.com/doble-bern/p/5963012.html
Copyright © 2011-2022 走看看