02ython基础知识(一)

本文详细介绍了Python的基本概念,包括变量定义规则、字符编码、用户输入、数据类型、运算符及流程控制等内容。此外还提供了一些实用的面试题解答技巧。

Python基础知识(一)

变量

name='monkeyfx'

变量定义的规则:

  • 变量名只能是 字母、数字或下划线的任意组合
  • 变量名的第一个字符不能是数字
  • 以下关键字不能声明为变量名:

    ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']

字符编码

ascill

默认ascill 英文 1字符1字节8个比特位

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号。

GB2312(1980年)

7445个字符,包括6763个汉字和682个其它符号。

GBK(中文最常用的)

GB2312 支持的汉字太少。GBK 27484个汉字,手机、MP3一般只支持GB2312。

Unicode万国码

可以代表所有字符和符号的编码Unicode(统一码、万国码、单一码)所有的字符统一1字符2字节16个比特位 即:2 **16 = 65536

2.x版本报错:ascii码无法表示中文

 #-*- coding: utf-8 -*-

3.x版本默认Unicode

UTF-8

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存

注释

单行注视:

# 被注释内容

多行注释:

""" 被注释内容 """

用户输入

input/raw_input

#name = raw_input("What is your name?") #only on python 2.x
#input读入数据位str格式
name = input("What is your name?")

getpass(在pycharm中不好使)

#输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:
import getpass
# 将用户输入的内容赋值给 name 变量
pwd = getpass.getpass("请输入密码:")

数据类型

数字

int(整型)

  在32位机器上,整数的位数为32位,取值范围为-231~231-1,即-2147483648~2147483647
  在64位系统上,整数的位数为64位,取值范围为-263~263-1,即-9223372036854775808~9223372036854775807

long(长整型)

  Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
  注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
Python3没有long的概念,统一为int

float(浮点型)

  浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。

complex(复数)

  复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257

布尔值

TrueFALSE
非00
非空

字符串

列表

元祖

运算符

算数运算:

假设变量a=10和变量b=20

操作符描述例子
+加法a + b = 30
-减法a - b = -10
*乘法a * b = 200
/b / a = 2
%模(取余)b % a = 0
**指数a**b = 10的20次幂
//地板除(结果是将小数点后的位数被除去的商,取挣)9//2 = 4 而 9.0//2.0 = 4.0

比较运算:

==|!=|<>|>|<|>=|<=
-|

赋值运算:

=|+=|-=|*=|/=|%=|**|//|
-|

位运算符:

位运算符作用于位和位操作执行位。假设,如果a =60;且b =13;现在以二进制格式它们将如下:

a = 0011 1100

b = 0000 1101


a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a = 1100 0011

操作符描述示例
&按位与(a & b) = 12 即 0000 1100
按位并(a 丨b) = 61 即 0011 1101
^按位异或(a ^ b) = 49 即 0011 0001
~按位翻转(~a ) = -61 即 1100 0011以2的补码形式由于带符号二进制数。
<<左移运算符a << 2 = 240 即 1111 0000
>>右移动运算符a >> 2 = 15 即 0000 1111
    a = 60            # 60 = 0011 1100
    b = 13            # 13 = 0000 1101
    c = 0
      
    c = a & b;        # 12 = 0000 1100
    print "Line 1 - Value of c is ", c
      
    c = a | b;        # 61 = 0011 1101
    print "Line 2 - Value of c is ", c
      
    c = a ^ b;        # 49 = 0011 0001 #相同为0,不同为1
    print "Line 3 - Value of c is ", c
      
    c = ~a;           # -61 = 1100 0011
    print "Line 4 - Value of c is ", c
      
    c = a << 2;       # 240 = 1111 0000
    print "Line 5 - Value of c is ", c
      
    c = a >> 2;       # 15 = 0000 1111
    print "Line 6 - Value of c is ", c

atANEFh.png

面试题

    1、判断一个数是否是2的N次方
      题目要求:用一个表达式,判断一个数X是否是2的N次方,即2,4,8,16……等,要求不可以用循环语句。
      解析:2,4,8,16这样的数转化成二进制是10,100,1000,10000。
      如果X减去1后(低一位并且二进制的每一位都是1),这个数与X做与运算,答案若是0,则X是2的N次方。
    
    2、两个数的交换
      题目要求:将a,b两个数的值进行交换,并且不使用任何的中间变量。
    解法1:
                 a = a+b;
                 b = a-b;
                 a = a-b;
    解法2:采用异或位运算。
      异或运算:相同为0,相异为1。
          a = a^b;//a变为一个相同为0,相异为1的结果
          b = a^b;//该结果和b做运算,得到原来的a
          a = a^b;//该结果和a做运算,得到原来的b

学习资料
http://python.jobbole.com/85168/

逻辑运算:

运算符|描述|示例
-|
and |与运算符。如果两个操作数都是真的,那么则条件成立。|(a and b) 为 true.
or |或运算符。如果有两个操作数都是非零然后再条件变为真。|(a or b) 为 true.
not |非运算符。用于反转操作数的逻辑状态。如果一个条件为真,则逻辑非运算符将返回false。|not(a and b) 为 false.

成员运算:

操作符描述
in计算结果为true,如果它在指定找到变量的顺序,否则false。
not in计算结果为true,如果它不找到在指定的变量顺序,否则为false。

运算符优先级

运算符描述
**幂(提高到指数)
~ + -补码,一元加号和减号(方法名的最后两个+@和 - @)
* / % //乘,除,取模和地板除
+ -加法和减法
>> <<左,右按位转移
&位'AND'
^按位异'或'和定期或'
<= < > >=比较运算符
<> == !=等式运算符
= %= /= //= -= += *= **=赋值运算符
is is not标识运算符
in not in成员运算符
not or and逻辑运算符

流程控制

if-else

if-elif-elif-else

for循环

for i in range(10):
    print(i )
a=[1,2,3,4]
for item in a:
    print(item )

while 条件:

continue用于退出当前循环,继续下一次循环

break用于退出所有循环

三元运算

condition ? true_part : false_part
判定条件?为真时的结果:为假时的结果

    result=5>3?1:0
    >>> 1 if True else 0
    1
    >>> 1 if False else 0
    0
    >>> "Fire" if True else "Water"
    'Fire'
    >>> "Fire" if False else "Water"
    'Water'

lambda表达式

    m = lambda x,y,z: (x-y)*z
    print m(3,1,2)
    #结果是4


    sum = lambda x, y:   x + y   
    #  def sum(x,y): 
    #       return x + y

    sum = lambda x, y:   x + y   
    #  def sum(x,y): 
    #   return x + y
    

杂记

  • 单双引号活用

      "I'm monkeyfx"
  • 模块一般放置在Python/2.7/site-packages目录下,所以自己写的模块调用记得加path,或放入上述目录

转载于:https://www.cnblogs.com/monkeyfx/p/6886464.html

<think>好的,用户想了解Python生成器的使用方法和原理。首先,我需要回忆自己掌握的关于生成器的知识,并结合提供的引用资料来整理回答。 首先,生成器的概念。根据引用[3],生成器是动态提供数据的可迭代对象,结合了可迭代对象和迭代器的特性。也就是说,生成器既实现了__iter__方法,又有__next__方法,可以逐个产生值,而不需要次性生成所有数据。这点很重要,特别是在处理大数据或无限序列时,可以节省内存。 接下来,用户可能需要知道生成器的两种创建方式。种是生成器表达式,类似于列表推导式,但用圆括号。例如(i for i in range(10))。另种是通过yield关键字定义的生成器函数。当函数中使用yield,调用时不会立即执行,而是返回个生成器对象。每次调用next()时,执行到yield处暂停,并返回yield后的值,下次从暂停处继续执行。这点引用[1]提到生成器的底层原理涉及协程,应该与函数执行状态的保存有关,比如栈帧的控制。 然后,生成器的工作原理。根据引用[1]和[3],生成器的底层实现涉及Python函数的执行机制。普通函数调用会创建栈帧,函数返回后栈帧销毁。而生成器函数在yield时,保存当前状态(局部变量、指令指针等),下次迭代时恢复。这需要解释生成器如何维护其执行上下文,可能涉及协程的概念,但用户可能不需要太深入,但需要说明生成器如何暂停和恢复。 使用场景方面,生成器适合处理大数据文件,如逐行读取,避免内存不足。引用[3]提到生成器读取大文件的应用,可以举例说明。另外,生成器可用于无限序列,如斐波那契数列,或者作为数据管道进行流式处理。 性能优势方面,生成器惰性求值,节省内存。但需要注意生成器是单向的,不能回退,只能迭代次。这些优缺点需要明确告诉用户。 可能需要对比迭代器和生成器的区别。根据引用[2],迭代器需要实现__iter__和__next__,而生成器通过函数简化了这过程。生成器更简洁,不需要手动维护状态,而迭代器可能需要更多样板代码。引用[4]中的Counter例子展示了自定义迭代器,而生成器可以更简洁地实现类似功能。 用户可能还关心生成器与协程的关系。引用[1]和[4]提到协程的思想由来,生成器通过yield不仅可以产生值,还可以接收值(在Python 2.5之后),这为协程打下了基础。但用户问题可能不需要深入协程,所以这部分可以简要提及或作为扩展内容。 总结回答结构:先定义生成器,然后使用方法(两种创建方式),原理(状态暂停与恢复),应用场景,优缺点,最后相关问题引导深入学习。需要确保使用正确的LaTeX格式,比如变量用$...$,代码块用反引号,并引用相关文献。 需要检查是否有遗漏的关键点,比如生成器的执行流程,如何捕获StopIteration异常,或者生成器对象的生命周期。此外,是否提到send()、throw()、close()等方法,但这些可能属于高级用法,用户问题可能只需要基础,所以暂时不深入。 最后生成相关问题,比如生成器与迭代器的区别,如何读取大文件,生成器在协程中的应用等,参考已有引用中的内容。</think>### Python生成器使用方法及原理详解 #### 、生成器的定义与核心特性 生成器是**动态提供数据的可迭代对象**,结合了可迭代对象(需实现`__iter__`方法)和迭代器(需实现`__next__`方法)的特性[^3]。其核心优势是**惰性求值**,即循环次、计算次、返回次,避免次性加载全部数据到内存。 #### 二、生成器的创建方法 1. **生成器表达式** 语法类似列表推导式,但使用圆括号: ```python gen = (x**2 for x in range(10)) # 生成0~9的平方序列 print(next(gen)) # 输出0 ``` 2. **生成器函数(`yield`关键字)** 函数中包含`yield`语句时,调用该函数会返回生成器对象: ```python def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b gen = fibonacci() print(next(gen)) # 输出0 ``` #### 三、生成器的工作原理 1. **底层机制** 普通函数调用会创建栈帧并在返回后销毁,而生成器函数通过`yield`**暂停执行**,保留当前状态(局部变量、指令指针等),下次调用`next()`时恢复执行[^1][^3]。 2. **状态保存示例** ```python def counter(): n = 0 while True: yield n n += 1 gen = counter() print(next(gen)) # 输出0 print(next(gen)) # 输出1 ``` 每次`yield`后,变量`n`的值会被保留,下次从`yield`下行继续执行。 #### 四、生成器的应用场景 1. **处理大文件** 逐行读取文件,避免内存溢出: ```python def read_large_file(file_path): with open(file_path, 'r') as f: for line in f: yield line.strip() ``` [^3] 2. **无限序列** 如斐波那契数列、素数生成器,无需预定义长度。 3. **数据管道** 通过多个生成器串联实现流式处理: ```python def filter_even(numbers): for n in numbers: if n % 2 == 0: yield n ``` #### 五、生成器的优缺点 | 优点 | 缺点 | |-----------------------|---------------------| | 节省内存(惰性计算) | 数据只能单向遍历次| | 支持无限数据流 | 无法随机访问元素 | | 简化迭代器实现 | 调试难度较高 | #### 六、生成器与迭代器的对比 - **迭代器**:需手动实现`__iter__`和`__next__`,如引用[4]中的`Counter`类。 - **生成器**:通过`yield`自动实现迭代协议,代码更简洁[^2][^4]。 ```python # 生成器实现Counter功能 def counter_gen(max_value): count = 0 while count < max_value: count += 1 yield count for num in counter_gen(5): print(num) # 输出1,2,3,4,5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值