python基础

此篇只针对有编程基础的同学

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# python 3.x 学习笔记
# 其中一些函数与JavaScript进行了对比
# pyhon 与 JavaScript 都是 动态语言, 所以变量类型可以相互转换
# python 部分内置属性是大写开头的, 应当注意, 如 False, True, None
# Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在-2147483648-2147483647
# python 中 没有;
# 不要对小数做 ^ 运算, 会报错

# 廖雪峰的官方网站: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
# 菜鸟教程: http://www.runoob.com/python/python-tutorial.html

# 打印文本, 相当于 console.log
print('hello world')
print('hello', 'world')

# 定义变量, 相当于 var, python没有常量
name = 'mtshen'
PI = 3.1415926
print('name:', name, '\r\n', 'PI:', PI)

# && 运算
f1 = True and True
print('f1:', f1)

# || 运算
f2 = True or False
print('f2:', f2)

# ! 运算
f3 = not False
print('f3:', f3)

# 求余
f4 = 10 % 3
print('f4:', f4)

# 地板求值, 值始终是整数
f5 = 10 // 3
print('f5:', f5)

# 定义长文本
f6 = '''hello world
hello world
hello world'''
print('f6:', f6)

# 文本转义\
f7 = 'I\'m mtshen!'
print('f7:', f7)

# 定义非转义文本(内容全部不转义)
f8 = r"I'm mtshen"
print('f8:', f8)

# 等待用户输入
# 注意, 这是阻断性的, 用户没有输入完成后面的程序不会继续执行
f9 = input()
print('f9:', f9)

# 格式化字符串 % 运算符
# %s表示用字符串替换
# %d表示用整数替换
# %f表示用浮点数替换
# %x表示用十六进制整数替换
# 如果只有一个%?,括号可以省略
f10 = 'hello, %s' % 'world'
f11 = 'hello %s, %d, %f, %x' % ('world', 100, 100, 100)
print('f10:', f10, '\r\n', 'f11', f11)

# 字符串编码 类似于 String.charCodeAt
f12 = ord('A')
print('f12:', f12)

# 字符串解码 类似于 String.fromCharCode
f13 = chr(97)
print('f13:', f13)

# 定义bytes字符串
f14 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c'
print('f14:', f14)

# 编码成为bytes字符串
f15 = '你好 世界'.encode('utf-8')
print('f15:', f15)

# 解码bytes字符串
f16 = b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c'.decode('utf-8')
print('f16:', f16)

# 解码bytes 兼容处理
f17 = b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4'.decode('utf-8', errors='ignore')
print('f17:', f17)

# 计算字符长度
f18 = len('hello world')
f19 = len(b'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\x96\xe7\x95\x8c')
print('f18:', f18, '\r\n', 'f19:', f19)

# ========================================
# 列表 List 相当于 Array
l1 = ['hello', 'world']
print('l1:', l1)

# 列表长度
l2 = len(['hello', 'world'])
print('l2:', l2)

# 列表倒获取-1就是倒数第一位, 依次类推
l3 = [0, 1, 2, 3, 4, 5][-1]
print('l3:', l3)

# 末尾追加, 相当于push
l4 = [0, 1, 2, 3, 4]
l4.append(5)
print('l4:', l4)

# 插入任意位置
l5 = [0, 1, 2, 3, 4]
l5.insert(2, '5')
print('l5:', l5)

# 删除尾元素 pop, 如果传入值则删除指定的位置
l6 = [0, 1, 2, 3, 4, 5]
l6.pop(1)
print('l6:', l6)

# 元组 Tuple 相当于 new Array(X), 他的长度是不可变化的
t1 = ('hello', 'world')
print('t1:', t1)

# 打印某一位, 与list一致
t2 = ('hello', 'world')[0]
print('t2:', t2)

# 判断
a1 = 100
if a1 > 50:
  print('a1: a1 > 50')

# else
a2 = 40
if a1 > 50:
  print('a2: a2 > 50')
else:
  print('a2: a2 < 50')

# elif
a3 = 50
if a3 > 50:
  print('a3: a3 > 50')
elif a3 == 50:
  print('a3: a3 = 50')
else:
  print('a3: a3 < 50')

# 转换字符串为整数 int
a4 = int('100')
print(a4)


# 练习
# 请根据BMI公式(体重除以身高的平方)计算BMI指数,并根据BMI指数:
# 体质指数(BMI)= 体重(kg) ÷ 身高^2(m)
# 低于18.5:过轻
# 18.5-25:正常
# 25-28:过重
# 28-32:肥胖
# 高于32:严重肥胖

print('练习1: BMI')
weight = float(input('weight(kg): '))
height = float(input('height(m): '))
bim = weight / (height * height)

print('你的BIM指数为: %s' % bim)
if bim < 18.5:
  print('你的体重过轻了')
elif bim < 25:
  print('你的体重正常')
elif bim < 28:
  print('你的体重过重了')
elif bim < 32:
  print('你的体重过于肥胖')
else:
  print('你的体重严重肥胖')

# ======================================
# 循环 

# for...in...
x1 = [1, 2, 3, 4, 5]
for x in x1:
  print('x1 循环:', x)

# while
x2 = 0
while x2 > 10:
  x2 = x2 + 1
  print('x2 循环:', x2)

# 生成整数序列
x3 = range(5)
print('x3:', x3)

# 转换成list
x4 = list(range(5))
print('x4:', x4)

# break结束循环
x5 = list(range(100))
for x in x5:
  if x == 10:
    break
  else:
    print('x5 循环:', x)

# 跳出某一次循环 continue
x6 = list(range(10))
for x in x6:
  if x == 6:
    continue
  else:
    print('x6 循环:', x)

# Dict字典,类似Object
# key 必须加引号, 不能使用.运算符, 如果没有符合的key会报错

d1 = { 'name': 'mtshen' }
print('d1:', d1)
print('d1 name:', d1['name'])

# 判断key是否存在
d2 = 'name' in { 'name': 'mtshen' }
print('d2:', d2)

# 使用get获取对用value, 如果不存在不会报错会返回None或自己预定的字符
d3 = {'name': 'mtshen'}.get('data')
d4 = {'name': 'mtshen'}.get('data', 'hello world')
print('d3:', d3, '\r\n', 'd4:', d4)

# 删除某个key
d5 = {'name': 'mtshen', 'data': 'hello world'}
d5.pop('data')
print('d5:', d5)

# Set 键不可重复
s1 = set([1, 1, 2, 2, 3, 3]) # {1, 2, 3}
print('s1:', s1)

# 添加键
s2 = set([1, 2, 3])
s2.add(4) # {1, 2, 3, 4}
print('s2:', s2)

# 删除键
s3 = set([1, 2, 3, 4, 5])
s3.remove(4) # {1, 2, 3, 5}
print('s3:', s3)

# =====================================================
# 函数
# 一些常用函数与JavaScript函数差不多, 如
# abs(): Math.abs(), max(): Math.max(), min(): Math.min()
# int(): Number.parseInt(), float(): Number.parseFloat(), bool(): Boolean()

# 定义函数 def
def fn1(x):
  print('fn1:', x)

fn1('hello world')

# 定义空函数
def fn2():
  pass

fn2()

# 类型检查 isinstance
type1 = isinstance(1, int)
print('type1', type1)

# 多类型检查
type2 = isinstance(1, (int, float))
print('type2', type2)

# 主动抛出类型错误
# 几种错误类型
# TypeError 类型错误
# SyntaxError 语法错误
# IndexError 索引错误
# AttributeError 属性错误
# KeyError 关键字错误
# ValueError 可能为字符串字串错误
# IndentationError 缩进错误
# 更多详见 https://blog.csdn.net/Karen_Yu_/article/details/78629918
# raise TypeError('type error!') # 报错会阻断程序运行, 解注释可执行

# 返回值 return
def fn3():
  return 'hello world'

print('fn3:', fn3())

# 多返回值
def fn4():
  return 100, 500 # 相当于返回了一个tuple元素(100, 500), 返回值可省略括号

fnr1, fnr2 = fn4() # 接收返回值
print('fn4:', fnr1, fnr2)

# 预设默认值, 设置预设值后执行函数, 可以不传入指定参数
# !! python 中不要对预设的List, Dict, Set等可变类型值直接进行修改
# 因为默认参数共同指向了同一个不变对象 !!!
def fn5(name = 'mtshen'):
  print('fn5:', name)

fn5()

# 不限定长度函数, 参数加*
# * 相当于 函数中的参数解构
def fn6(*angs):
  print('f6:', angs)

fn6(1, 2, 3, 4, 5)

# 部分参数解构, 如果只有部分参数进行解构, 意味着必须传入参数名, 以 key = value 的形式传入
def fn8(name, value, **data):
  print('fn8:', name, value, data)

fn8('mtshen', 21, a = 5, b = 6, c = 7)

# 利用 * 对传入参数解构
def fn7(name, value):
  print('f7:', name, value)

fn7(*['mtshen', 'hello world'])

# 关键字命名, 限定传入的参数名, 必须以 key = value 的形式传入, 这种方式传入, 不限定传入顺序
# * 后的参数必须以 key = value 的形式传入
def fn9(*, name, age):
  print('fn9:', name, age)

fn9(age = 21, name = 'mtshen')

# 如果参数中存在 *key 那么等同于 *, 后面的参数必须以 key = value 的形式传入
def fn10(name, *agrs, age):
  print('fn10:', name, agrs, age)

fn10('mtshen', 1, 2, 3, 4, 5, age = 21)

# 参数组合
# 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数
# 这5种参数都可以组合使用
# 但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
# 如
def fn11(name, age = 21, *agrs, **kw):
  pass

# ===================================================
# python 特性

# 切片, list切片即获取某一区间的数组内容
# 可以使用[min:max], [:max], [min:] 也可以输入负值, 表述倒数位置
# 切片同样适用于字符串, list, 元组, 字典, set
qp1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10][1:4] # 1 - 4 但不包含 4, 
print('qp1:', qp1)

# 利用切片浅拷贝
qp2 = qp1[:]
print('qp2:', qp2)

# 利用切片间隔取值
qp3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][::2] # 每间隔 2 个便取值
print('qp3:', qp3)

# 切片间隔取值2
qp4 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][:5:2] #下标为5 之前每间隔 2 个取值
print('qp4:', qp4)

# 迭代
# 迭代中使用下标 enumerate 可以将 ['name'] 转换成 [(0, 'name')]
dd1 = ['name', 'age', 'data', 'value']
for index, data in enumerate(dd1):
  print('dd1:', index, data)

# 列表生成器
# 如果要生成 1, 2, 3, 4, 5 可以使用
list1 = [x for x in range(1, 6)]
print('list1:', list1)

# 列表生成器基本结构是
# [结果表达式 for...in...{1,} if{0,}]
# 如
list2 = ['value:' + str(value) for value in range(1, 11) if value > 5 ]
print('list2:', list2)

# 列表生成器中 for in 和 if 可以写多个, 进行迭代
# 有木有很唬人, 其实原理很简单
list3 = [(x, y) for x in range(1, 10) for y in range(1, 10) if x > 5 if y > 5]
print('list3:', list3)

# 生成器
# 生成器的目的在于计算一组有规律的列表内容, 在大量内容的情况下, 能够减少内存的占用
# 写法与列表生成器一致, 只不过 [] 变成 ()
sc1 = (x * 6 for x in range(999999999)) # 生成 999999999 个数据
print('sc1:', sc1)

# 生成器可以用for in 遍历外, 还可以使用next来取得下一个生成内容
sc2 = next(sc1)
print('sc2:', sc2)

# yield 关键字创建生成器
#当使用 yield 时, 你的函数将变成生成器 generator, 每次next, 会执行到下一个 yield
def yieldfn():
  yield 1
  yield 3
  yield 5
  yield 7

yieldfn0 = yieldfn()
yieldfn1 = next(yieldfn0)
yieldfn2 = next(yieldfn0)
yieldfn3 = next(yieldfn0)
yieldfn4 = next(yieldfn0)
print('yieldfn:', yieldfn)
print('yieldfn next:', yieldfn1)
print('yieldfn next:', yieldfn2)
print('yieldfn next:', yieldfn3)
print('yieldfn next:', yieldfn4)

# 迭代器
# 判断属性是否可以迭代, 前提是要引入 Iterable
# from collections import Iterable
# isinstance([], Iterable)

# 字符转迭代
# isinstance(iter('hello world'), Iterable)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249