【笔记】《Python语言以及应用》- 基础语法

主要内容:

  1. Python基本元素:数字、字符串和变量
  2. Python容器:列表、元组、字典、集合
  3. 程序结构

一、Python基本元素:数字、字符串和变量


Python基本数据类型(不可变): bool, int, float, str

1. 变量

变量名只能包含大小写字母、数字、下划线,开头不能为数字

type()检查对象的类型: type('hello') # <class 'str'>

2. 数字

常见运算: +, -, *, /(浮点数除法,结果为小数), //(整除,结果为整数), %(求余), **(幂)

自运算: -=, +=, *=, /=, ...

类型转换: int(), float()

隐式转换: int + float = float, bool + int = int

divmod(9, 5) # (1, 4) 类似于(9 // 5, 9 % 5),获得整数和余数

3. 字符串

三元引号用于创建多行字符串: 每一行的换行符以及行首和行尾的空格都会被保留

single = 'hello world'
multi = '''
  hello
  world
'''
print(len(single))  # 11
print(len(multi))   # 17

类型转换: str()

转义字符: \n, \t, \', \", \\, \000(空格)

常用操作:

  • 拼接+: 'a' + 'b' # ab
  • 复制*: 'a' * 3 # aaa
  • 提取单个字符[]: 'abc'[1] # b(超过偏移量报错)
  • 切片[start:end:step](不包括end):
    • [:]复制整个字符
    • [start:]从start到结尾
    • [:end]从开头到end-1
    • [start:end]从start到end-1
    • [start:end:step]从start到end-1, 每step个字符提取一个
    • [-n:]最后n个
    • [::-1]反向, 等同于[-1::-1]
    • 对于超过偏移量的,start当作0, end当作-1
  • len()获取长度
  • split()分割(默认使用空白字符-\n,\t,\000): 'a,b,c'.split(',') # ['a', 'b', 'c']
  • join()合并: ','.join(['a', 'b', 'c']) # 'a,b,c'

字符串常用方法:

  • str.startswith('a'), 是否以'a'开头
  • str.endswith('a'), 是否以'a'结尾
  • str.find('a'), 查询第一次出现'a'的位置
  • str.rfind('a'), 查询最后一次出现'a'的位置
  • str.count('a'), 统计'a'出现的次数
  • str.strip(), 移除头尾指定的字符(默认为空格)
  • str.capitalize(), 首字母大写
  • str.title(), 所有单词的开头字母都大写
  • str.lower(), 小写
  • str.upper(), 大写
  • str.swapcase(), 大小写互换
  • str.replace('a ', 'hello', count), 字符串替换,count默认替换所有实例

二、Python容器:列表、元组、字典、集合


1. 列表(list: 可变、有序、重复)

创建列表: list()或者[]

转换:

  • 字符串:list('abc') # ['a', 'b', 'c']
  • 元组:list(('a', 'b', 'c')) # ['a', 'b', 'c']
  • split():'a,b,c'.split(',') # ['a', 'b', 'c']

使用[offset]获取和修改元素((超过偏移量会报错))

使用切片[start:end:step]提取部分列表(同字符串切片)

操作数组:

  • list.append(x)尾部添加元素
  • list.extend(x)或+=合并列表
  • list.insert(i, x)指定位置之前插入元素
  • del list[i]删除指定位置的元素
  • list.remove(x)删除具有指定值的元素(只删除匹配的第一个元素)
  • list.pop(i)获取并删除指定位置的元素,pop(0)头部、pop()pop(-1)尾部
  • list.index(x)返回列表中第一个值为 x 的元素的索引
  • in判断值是否存在
  • list.count(x)记录x出现的次数
  • ', '.join(list)转换为字符串
  • list.sort()改变list,sorted(list)不改变list,而是生成其副本,参数reverse=True改为降序排序
  • len(list)获取长度

数组复制:

  • copy函数:a.copy()
  • list()转换函数:list(a)
  • 切片:a[:]

2. 元组(tuple: 不可变)

元组占用空间小
不会意外修改元组的值
可以用作字典的键
命名元组可以替代对象
函数的参数是以元组的形式传递的

# 创建元组
empty_tuple = ()
one_char = 'a', 
char_tuple = 'a', 'b', 'c'
character = ('a', 'b', 'c')

# 元组解包
a, b, c = character

# 互换
b, a = a, b

# 转换
tuple(list)

3. 字典(dict: 可变)

创建字典: {}

转换:dict()(将包含双值子序列的序列转换为字典)

lol = [['a', 1], ['b', 2], ['c', 3]]  # (a list of two-item list)
lot = [('a', 1), ('b', 2), ('c', 3)]  # (a list of two-item tuple)
tol = (['a', 1], ['b', 2], ['c', 3])  # (a tuple of two-item list)
los = ['a1', 'b2', 'c3']
tos = ('a1', 'b2', 'c3')

dict(lol)   # {'a': 1, 'b': 2, 'c': 3}
dict(lot)   # {'a': 1, 'b': 2, 'c': 3} 
dict(tol)   # {'a': 1, 'b': 2, 'c': 3} 
dict(los)   # {'a': '1', 'b': '2', 'c': '3'}
dict(tos)   # {'a': '1', 'b': '2', 'c': '3'}

常用操作

  • dict.update(d)合并字典,新规入的字典的值取代原有的值
  • del dict[key]删除具有指定键的元素
  • dict.clear()删除所有元素
  • in判断是否存在
  • dict.get(key, default)获取元素,不存在时,返回默认值(默认为None),(dict[key]获取不到时会报错)
  • dict.keys()获取所有的键(list(dict.keys())转换为list)
  • dict.values()获取所有的键(list(dict.values())转换为list)
  • dict.items()获取所有的键(list(dict.items())转换为list)
  • dict.copy()复制

4. 集合(set: 无序、不重复、可变)

集合就像舍弃了值, 仅剩下键的字典

创建集合: set(), {1, 3, 6, 9}

转换:

set('letter')    # {'l', 'r', 't', 'e'}
set(['a', 'b', 'c'])      # {'c', 'b', 'a'}
set(('a', 'b', 'c'))      # {'c', 'b', 'a'}
set({'a': 1, 'b': 2, 'c': 3})    # {'c', 'b', 'a'}

in检查是否存在

运算符:

a = {1, 2}
b = {2, 3}

& 交集(a.intersection(b))
a & b # {2}

| 并集(a.union(b))
a | b # {1, 2, 3}

- 差集(a.difference(b))(出现在第一个集合但不出现在第二个集合)
a - b # {1}

^ 异或集(a.symmetric_difference(b))(两个集合中的不同元素)
a ^ b # {1, 3}

<= 判断子集(a.issubset(b))
a <= b  # False

>= 判断真集(a.issuperset(b))
a >= b  # False

三、程序结构


1. #注释

Python没有多行注释

2. \连接

把一段长代码分成多行()

# 拼接长字符串
alphabet = ''
alphabet += 'abc'
alphabet += 'def'

# 使用\
alphabet = 'abc' + \
          'def'

1 + 2 + 3
使用\
1 + 2 + \
3

3. if elif else条件判断

num = 2
if num == 1:
  print('This is one')
elif num === 2:
  print('This is two')
else:
  print('I don\'t known')

判断假值

类型 假值
bool False
null类型 None
int 0
float 0.0
str ''
list []
tuple ()
dict {}
set set()

4. while循环

# 读入整数,如果是奇数则输出其平方数,偶数则跳过,q来结束循环
while True:
  value = input('Integer, please [q to quit]: ')

  if value == 'q':
    break             # break 跳出循环
  
  number = int(value)

  if number % 2 == 0:
    continue          # 跳出本次循环,继续下一个循环
  
  print(number, 'squared is', number**2)

循环外使用else: 如果while循环正常结束(没有使用break跳出),程序将执行可选的else片段

5. for...in迭代

list, str, tuple, dict, set都是可迭代的对象
break, continue, else和while一样

range(start, stop, step)生成自然数序列(不包括stop)

zip()并行迭代

alphabet = ['a', 'b', 'c']
number = [1, 2, 3, 4]
for c, n in zip(alphabet, number):
  print(c, n)

# 在最短序列用完时停止
# a 1
# b 2
# c 3

# 配对两个元组
list(zip(alphabet, number)) # [('a', 1), ('b', 2), ('c', 3)]

# 字典
dict(zip(alphabet, number)) # {'c': 3, 'a': 1, 'b': 2}

6. 推导式

列表推导式:

# [expression for item in iterable]
number_list = [x for x in range(3)]  # [0, 1, 2]

# [expression for item in iterable if condition]
a_list = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]

# 嵌套循环
rows = range(1, 4)
cols = range(1, 3)
# 传统
for row in rows:
  for col in cols:
    print(row, col)
# 推导式
cells = [(row, col) for row in rows for col in cols]
for row, col in cells:
  print(row, col)

字典推导式:

word = 'letters'
letter_counts = {letter: word.count(letter) for letter in word}
# {'e': 2, 'l': 1, 'r': 1, 't': 2, 's': 1}

集合推导式:

a_set = {number for number in range(1, 6) if number % 2 == 1}
# {1, 3, 5}

生成器推导式: (元组没有推导式)

number_thing = (number for number in range(1, 6))
type(number_thing)  # <class 'generator'>

for number in number_thing:
  print(number)

# 转换为list(一个生成器只运行一次,只在运行中产生值)
list(number_thing)  # [1, 2, 3, 4, 5]
list(number_thing)  # []

7. 函数

使用is判断None

def is_none(thing):
  if thing is None:
    print('It\'s None')
  elif thing:
    print('It\'s True')
  else:
    print('It\'s False')

is_none(None) # It's None
is_none([]) # It's False
is_none(1)  # It's True

参数
默认参数在函数被定义时就已经计算出来了

# bug
def buggy(arg, result=[]):
  result.append(arg)
  print(result)

buggy('a')  # ['a']
buggy('b')  # ['a', 'b']

# fix
def buggy(arg, result=None):
  if result is None:
    result = []
  result.append(arg)
  print(result)

buggy('a')  # ['a']
buggy('b')  # ['b']
def ours(first, middle, last):
  return {'first': first, 'middle': middle, 'last': last}

ours(1, 3, 7)  # 位置参数
ours(1, 3, last=5) # 关键字参数(关键字参数必须跟随在位置参数的后面)

# 使用*收集位置参数: 将一组可变数量的位置参数集合成参数值的元组
def print_args(required1, required2, *args):
  print(required1, required2, args)

print_args(1, 2)  # 1 2 ()
print_args(1, 2, 3, 4, 5) # 1 2 (3, 4, 5)

# 使用**收集关键字参数: 将关键字参数收集到一个字典中
def print_kwargs(required1, *args, **kwargs):
  print(required1, args, kwargs)

print_kwargs(1, 2, 3, a=4, b=5) # 1 (2, 3) {'b': 5, 'a': 4}

闭包:

def outer(num):
  def inner():
    return 'This is %d' % num
  return inner

a = outer(1)
b = outer(2)

print(a())  # This is 1
print(b())  # This is 2

lambda()函数:

def edit_story(words, func):
  for word in words:
    print(func(word))

edit_story(['hello', 'bye', 'see'], lambda word: word.capitalize() + '!')
# Hello!
# Bye!
# See!

8. 生成器

调用生成器函数,返回一个generator对象,供迭代器产生数据

def my_range(first=0, last=10, step=1):
  number = first
  while number < last:
    yield number
    number += step

for x in my_range(1, 5):
  print(x)

9. 装饰器

在不改变源代码的情况下修改已经存在的函数

def document_it(func):
  def new_func(*args, **kwargs):
    print('Running function:', func.__name__)
    print('arguments:', args, kwargs)
    result = func(*args, **kwargs)
    print('Result:', result)
    return result
  return new_func

@document_it
def add_ints(a, b):
  print('...execute...')
  return a + b

# 等价于
# def add_ints(a, b):
#   print('...execute...')
#   return a + b

# cooler_add_ints = document_it(add_ints)

add_ints(2, 4)

# Running function: add_ints
# arguments: (2, 4) {}
# ...execute...
# Result: 6

多个装饰器时,靠近def的装饰器最先执行

10. 命名空间和作用域

name = 'a'  # global

def print_global_name():
  print(name, id(name))

def print_local_name():
  name = 'b'  # local
  print(name, id(name))

def change_global_name():
  global name # 修改全局变量之前先在变量前面显式声明global
  name = 'b'
  print(name, id(name))

print_global_name() # a 61125472
print_local_name()  # b 61127936
print(name, id(name)) # a 61125472

change_global_name()  # b 61127936
print(name, id(name)) # b 61127936

11. try...except处理异常

short_list = [1, 2, 3]
while True:
  value = input('Position [q to quit]?')

  if value == 'q':
    break
  
  try:
    position = int(value)
    print(short_list[position])
  except IndexError as err:
    print('Bad index:', position)
  except Exception as other:
    print('Something else broken:', other)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • perl: warning: Falling back to a fallback locale ("en_US....
    keaidelele阅读 950评论 0 50
  • 超能量的咖啡冥想助力每一个人实现心中的目标。是时候为今天的好种子浇水施肥晒太阳了[太阳] 我近期最想实现的一个目标...
    张蓉萍阅读 123评论 0 0
  • 我说:下午要看完那本书; 我说:回家要刷几套题; 我说:这周的计划要完成; 我说…… 结果什么都没做 原来嘴把心要...
    八七九阅读 170评论 0 0
  • 以后不可两份外卖一起点... 晚上吃的不多,但是因为看话剧,并没有感到饿...被事情牵绊而占去注意力,会减少食物的...
    ninvxv阅读 209评论 0 0
  • 今天真是超级烧脑的一天。 从10:00—18:00,我一共听了21个牛人的分享。什么活动这么牛逼,能请到这么多牛人...
    作家格格阅读 254评论 3 2