Google Maps API提取城市名称:单行代码返回生成器问题排查
问题分析与解决办法
你的单行代码之所以返回生成器对象,核心原因是你直接打印了一个生成器表达式,而不是迭代它获取结果。
为什么会这样?
生成器表达式(你写的x['long_name'] for x in ... if ...本质就是生成器,只是省略了外层括号)是惰性求值的——它不会立刻计算出所有结果,而是生成一个可迭代的对象,只有当你主动去迭代它(比如用for循环、next()函数)时,才会逐个产生元素。直接打印生成器对象,Python只会输出它的内存地址标识,也就是你看到的<generator object <genexpr> at 0x0000021FB038F3B8>。
而你的for循环能正常工作,是因为for循环会自动迭代这个生成器,每次取出一个元素并打印,所以能得到Chandigarh。
修正方案
如果你想用单行代码直接获取并打印城市名称,可以用以下几种方式:
用
next()函数获取第一个匹配结果
地址组件中locality类型的条目通常只有一个,用next()可以直接取出生成器的第一个元素:print(next(x['long_name'] for x in geocode_result[0].get('address_components') if x.get('types')[0]=='locality'))为了避免没有找到
locality时抛出StopIteration错误,可以加一个默认值:print(next((x['long_name'] for x in geocode_result[0].get('address_components') if x.get('types')[0]=='locality'), "未找到城市"))转成列表后取第一个元素
用列表推导式代替生成器表达式,得到一个包含匹配结果的列表,再取索引0的元素:print([x['long_name'] for x in geocode_result[0].get('address_components') if x.get('types')[0]=='locality'][0])同样,这种方式如果没有匹配结果会抛出
IndexError,可以结合条件判断处理:cities = [x['long_name'] for x in geocode_result[0].get('address_components') if x.get('types')[0]=='locality'] print(cities[0] if cities else "未找到城市")
总结
生成器表达式是用来创建可迭代对象的工具,不是直接的结果集合。要获取里面的内容,必须通过迭代操作(for循环、next()、转列表/元组等)才行。
内容的提问来源于stack exchange,提问作者Wendy
相关产品推荐
相关产品推荐

