Python 基础

is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。类似于Java中的equal()和==

//表示整数除

反斜杠

# 错误写法
# print '\'
# 正确写法
print('\\')     # \
# 原生字符串
print(r'\\')    # \\
# 这是种错误的写法,即使使用原生字符串,也不能以奇数个反斜杠结尾
# print(r'asdf\')
# 解决办法,将他们分开就行
dir = r"\this\is\my\dos\dir"+"\\"
print(dir)

编码

Python3.X 源码文件默认使用UTF-8编码,所以可以正常解析中文,这里顺便提一句,UTF-8是Unicode的一种实现,Unicode只是规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100,1110,0010,0101),它是4个bit为基本单位,也可以说这个符号的表示至少需要2个字节。

在 Python 里,标识符由字母、数字、下划线组成,但不能以数字开头。
以下划线开头的标识符是有特殊意义的:

  1. 以单下划线开头,如 _ foo 代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;
  2. 以双下划线开头的 _ _ foo 代表类的私有成员
  3. 以双下划线开头和结尾的 _ _ foo _ _ 代表 Python 里特殊方法专用的标识,如 _ _ init _ _() 代表类的构造函数。我们在后面的面向对象会细说

在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如

str1 = 'python'
str2 = "python" 
str3 = 'I\'m a big fan of Python.'

可以注意到,原来的字符串中有一个',而Python又允许使用单引号' '来表示字符串,所以字符串中间的'必须用转义字符\才可以。为了避免使用转义符,可以使用单双引号的混合来定义字符串

str4_ = "We all know that 'A' and 'B' are two capital letters."
str5 = 'The teacher said: "Practice makes perfect" is a very famous proverb.'

三引号有两个用处:

  • 当我想要表达如下,很长的式子的时候,我们可以使用三引号
str1 = "List of name:\
        Hua Li\
        Chao Deng"

str2 = """List of name:
          Hua Li
         Chao Deng
       """
  • 而且使用3个引号还有一个特别的作用就是:加注释!

ASCii码和字符串

# 用户输入字符
c = input("请输入一个字符: ")
 
# 用户输入ASCII码,并将输入的数字转为整型
a = int(input("请输入一个ASCII码: "))
 
print( c + " 的ASCII 码为", ord(c))
print( a , " 对应的字符为", chr(a))

打印a到z

li=[chr(i) for i in range(ord("A"),ord("Z")+1)]

List

创建list只要把逗号分隔的不同的数据项使用方括号 [ ] 括起来即可,下标(角标,索引)从0开始,最后一个元素的下标可以写 -1,如

list = ['1','2',‘3’]
list = [] 空列表

添加和删除

list.append()   #在末尾增加一个元素
list.insert(n,'4')  #在指定位置添加元素,如果指定的下标不存在,那么就是在末尾添加
list1.extend(list2)  #合并两个list1,list2
list.pop()  #删最后一个元素
list.pop(n)  #删除指定的下标元素,如果删除一个不存在的元素会报错
list.reverse()  #将列表反转
list.remove(xx)  #删除list 里面的一个元素,有多个相同的元素,删除第一个 
list.sort()  #排序,默认升序

合并两个list要用“+”,或者extend,不能用append,那样它会把那个list直接放再最后一个元素

enumerate 用法(打印元素对应的下标)

for k,v in enumerate(xx):
  print("index=%s,value=%s"%(k,v))

切片(string里面也可以使用切片)

name[n:m]  切片是不包含后面那个元素的值(顾头不顾尾)
name[n:m:s] 
#s是步长,隔多少个元素取一次;步长是正数,从左往右取;步长是负数,从右往左取

List Comprehensions
实例1:要生成list [1, 2, 3, 4, 5]可以用:a = list(range(1,6))
实例2:生成[1x1, 2x2, 3x3, ..., 10x10]可以用 list = list(x * x for x in range(1,11))
实例3:for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:list = list(x * x for x in range(1,11) if x%2== 0)
实例4:使用两层循环,可以生成全排列:
list = [m + n for m in 'ABC' for n in 'XYZ']
print(list),输出结果:['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
实例5:for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

set 集合

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
创建:可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

x = set('runnoob')
print(x)
{'r', 'o', 'u', 'n', 'b'}
# set也可以使用comprehension,c里面只会有‘abc’
c = {x for x in 'aabbbcccc'}

a | b     # 集合a或b中包含的所有元素
a & b     # 集合a和b中都包含了的元素

generator

generator表达式的语法类似于python的"tuple类型的comprehension”,用圆括号()表示;而实际上tuple不像list,没有comprehension,所以不冲突。
list comprehension和generator表达式的主要区别在于,前者产生全部的list,后者每次仅产生一项,按需生成并“返回”结果。仅在接到请求的时候才会产生输出。因此,generator表达式比list comprehension更加节省内存

#每次都要调用next来生成
my_list = [1, 3, 6, 10]   
a = (x**2 for x in my_list)  
print(next(a))  
# Output: 1     
print(next(a))  
# Output: 9  ,可以看见它里面是记录了index信息的 

所以generator有以下特点:

  • 遵循迭代器(iterator)协议,迭代器协议实现iter、next接口
  • 能过多次进入、多次返回,能够暂停函数体中代码的执行

generator函数
在python的函数定义中,只要出现了yield表达式,那么事实上定义的是一个generator function,调用这个generator function返回值是一个generator。

def gen_generator():
    yield 1

def gen_value():
    return 1
    
if __name__ == '__main__':
    ret = gen_generator()
    print ret, type(ret)    
    #<generator object gen_generator at 0x02645648> <type 'generator'>
    ret = gen_value()
    print ret, type(ret)    
    # 1 <type 'int'>

下面是一个例子

def gen_example():
    print('before any yield')
    yield 'first yield'
    print('between yields')
    yield ('second yield')
    print('no yield anymore')

gen = gen_example()
a = gen.__next__()  # 第一次
print("第一次返回", a)
b = gen.__next__()  # 第二次
print("第二次返回", b)
c=gen.__next__()  # 第三次
print("第三次返回", c)

调用gen_example方法并没有输出任何内容,说明函数体的代码尚未开始执行。当调用__ next __()方法,generator会执行到yield 表达式处,并返回yield表达式的内容,然后暂停(挂起),所以第一次调用next打印第一句并返回“first yield”。 暂停意味着上下文都保存起来,直到下一次调用next方法恢复。第二次调用next之后就暂停在最后一个yield,再次调用next()方法,则会抛出StopIteration异常

因为for语句能自动捕获StopIteration异常,所以generator(本质上是任何iterator)较为常用的方法是在循环中使用:

def generator_example():
    yield 1
    yield 2
    
if __name__ == '__main__':
    for e in generator_example():
        print(e)

generator函数和普通函数的区别

  • generator函数包含一个以上的yield声明
  • generator函数被调用的时候,会返回一个iterator对象,但是函数并不会立即开始执行
  • iter()和next()方法被自动实现,所以可以使用next()函数对返回的此iterator对象进行迭代
  • 一旦一个generator 执行到yield语句,generator函数暂停,程序控制流被转移到调用方
  • 在对generator的连续调用之间,generator的本地变量和状态会被保存
    最终,generator函数终止,再调用generator会引发StopIteration异常

generator是一个很棒的表示无限数据流的工具。无限数据流不能被保存在内存里面,并且因为generator每次产生一个item,它就可以表示无限数据流。下面的代码可以产生所有的奇数

def all_even():  
    n = 0  
    while True:  
        yield n  
        n += 2  

使用场景:
1.当我们需要一个公用的,按需生成的数据;
2.A事情执行一部分,另一部分在B事件发生后再执行下一部分,实现异步。

lambda

可以这样认为,lambda作为一个表达式,定义了一个匿名函数,下面的代码x为入口参数,x+1为函数体。在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解

func=lambda x:x+1
print(func(1))
#>>2
#以上lambda等同于以下函数
def func(x):
  return(x+1)

对于内置函数也很有用

#map(function,iteration) 会根据提供的函数对指定序列做映射
li = [11, 22, 33]
sl = [1, 2, 3]
new_list = map(lambda a, b: a + b, li, sl)

位运算

变量 a 为 60,b 为 13二进制格式如下:

a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 

(a & b) =12     #二进制解释: 0000 1100
a << 2 =240     #二进制解释: 1111 0000

集合

discard() 方法用于移除指定的集合元素。

该方法不同于 remove() 方法,因为 remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。

symmetric_difference():返回两个集合组成的新集合,但会移除两个集合的重复元素:也可以使用^

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,723评论 17 410
  • 闭包和装饰器 闭包:就是在一个外函数中定义了一个内部函数,内部函数引用了外函数的临时变量,并且外函数的返回值就是内...
    有猫饼233阅读 804评论 0 0
  • python入门有很多教程,习惯上比较讲究快速学习的同学,可以选择廖雪峰的网站和python简明教程,小小白上半年...
    顾维安阅读 920评论 0 3
  • 安装 安装python解释器,默认在安装过程中加入到环境变量中。安装包官方文档安装完成后,在IDLE中可以直接编写...
    hgzzz阅读 196评论 0 0
  • 一.写在最前二.开始吧三.数据类型四.结构控制五.函数六.模块和包七.类八.异常九.文件操作十.网络编程十一.多任...
    宙斯YY阅读 460评论 0 0

友情链接更多精彩内容